Leetcode ---- 15.三数之和

题目:

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

思路:

这道题第一反应就是三个for循环再去重。很显然,这样做效率太低,时间复杂度太高。

那么,仔细看这道题,  a + b + c = 0 =>  b+ c = -a

我们可以采用双指针的方法。将a作为第一个循环参数,双指针分别指向的是 b、c。通过判断 a 与 b、c 之间的大小来移动双指针。当然,最重要的前提,我们需要将该数组进行排序,这样,我们才能正确的找到满足要求的组合。

期间,遇到相同的元素,则跳过。

程序:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<vector<int>> res;
        vector<int> tmp;
        if (nums.size() < 3)
            return res;
        
        int i = 0,j,k,val;
        int len = nums.size();
        while (i < len-2){
            j = i + 1;
            k = nums.size() - 1;
            val = -nums.at(i);
            while (j < k){
                if (nums[j]+nums[k] == val){
                    tmp.emplace_back(nums.at(i));
                    tmp.emplace_back(nums.at(j));
                    tmp.emplace_back(nums.at(k));
                    res.emplace_back(tmp);
                    tmp.clear();
                    j++;
                    k--;             
                    while (nums[j] == nums[j-1] && j < k){
                        j++;
                    }
                    while (nums[k] == nums[k+1] && j < k){
                        k--;
                    }
                }
                else if (nums[j]+nums[k] < val){
                    j++;
                }
                else{
                    k--;
                }
            }
            i++;
            while (nums[i] == nums[i-1]){
                i++;
            }
        }
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/hc372893308/article/details/83831245