15.三数之和

排序后,利用指针一前一后扫描,使复杂度从n的三次方一直到n的平方

下面是两种不同的写法,但思路是一样的(推荐第一种,与16.最接近的三数之和的思路和写法一样,可以当成一种板子)

1.

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector <vector<int> > ans;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size(); i ++)
        {
             if(i && nums[i] == nums[i-1]) continue;
             int j = i + 1, k = nums.size() - 1;
             while(j < k)
             {
                int sum = nums[i] + nums[j] + nums[k];
                if(sum == 0)
                {
                    ans.push_back({nums[i], nums[j], nums[k]});
                    while(j < k && nums[j] == nums[j+1]) j++;
                    while(j < k && nums[k] == nums[k-1]) k--;
                    j++; k--;
                }
                else if(sum > 0) k--;
                else if(sum < 0) j++;
             }
        }   
        return ans;
    }
};

2.

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector <vector<int> > ans;
        sort(nums.begin(), nums.end());
        for(int i = 0; i < nums.size(); i ++)
        {
             if(i && nums[i] == nums[i-1]) continue;
                for(int j = i+1, k = nums.size()-1; j < k; j++)
                {
                    if(j > i+1 && nums[j] == nums[j-1]) continue;
                    while(j < k-1 && nums[i]+nums[j]+nums[k-1] >= 0) k--; //先判断, 后进行匹配
                        if(nums[i] + nums[j] + nums[k] == 0)
                        ans.push_back({nums[i], nums[j], nums[k]});
                }
        }   
        return ans;
    }
};

 

posted @ 2020-11-13 23:09  ATKevin  阅读(106)  评论(0编辑  收藏  举报