Leetcode 15. 3Sum

Given an array S of n integers, are there elements abc in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note:

  • Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
  • The solution set must not contain duplicate triplets.

    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)

题目大意:找出三个数加起来为0,要把所有的组都找出来

题目分析:固定i,其他两个 j 放在第一个的后面,k放在尾部。如果要和小于0,则 j 往后移动一个单位,如果和大与0 ,k往前移动一个单位。

要注意重复的情况

代码如下:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> ans;
        
        if(nums.size()<3)//长度小于3无答案
            return ans;
            
        sort(nums.begin(), nums.end());//先排序
        
        int i,j,k;
        for(i=0;i<nums.size()-1;i++){
            if(i>0&&nums[i-1]==nums[i])//去除重复
                continue;
            j=i+1;k=nums.size()-1;
            while(j<k){
                if(nums[i]+nums[j]+nums[k]==0){
                    ans.push_back({nums[i],nums[j],nums[k]});
                    while(j<--k&&nums[k]==nums[k+1]);//去除重复
                    while(j++<k&&nums[j-1]==nums[j]);//去除重复
                } 
                else if(nums[i]+nums[j]+nums[k]<0)
                    while(j++<k&&nums[j-1]==nums[j]);//去除重复
                else
                    while(j<--k&&nums[k]==nums[k+1]);//去除重复
            }
        }
        return ans;
    }
};


你可能感兴趣的:(LeetCode,C++,双指针,3Sum)