3Sum

思路:

先排序,从小到大。

三个数的加法,可以先确定一个数,剩下两个数在剩下的范围找,当总和比目标值大,就让最大的范围数减小,小就让最小的数增加。

注意几点就是:

第1个数,后面两个数可以有多种,所以要搜完所有数。

对于重复的数,可以跳过。

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
       vector<vector<int>> trip;
       trip.clear();
       if(nums.size()<3) return trip;
        sort(nums.begin(),nums.end());
            int i=0,j,k;
            while(i<nums.size()-2)
            {
                while(i>0 &&nums[i]==nums[i-1]) i++;
                j=i+1;k=nums.size()-1;
                while(j<k )
                {
                    while(j>i+1 &&nums[j]==nums[j-1] &&j<k) j++;
                    while(k<nums.size()-1 &&nums[k]==nums[k+1] &&j<k) k--;
                    while(nums[i]+nums[j]+nums[k]>0 &&j<k) k--;
                    while(nums[i]+nums[j]+nums[k]<0 &&j<k) j++;
                    if(nums[i]+nums[j]+nums[k]==0 &&j<k)
                    {
                        vector<int> a;
                       a.push_back(nums[i]);
                       a.push_back(nums[j]);
                       a.push_back(nums[k]);
                       trip.push_back(a);
                       j++;k--;
                    }
                    
                }
                i++;
                
            }
            return  trip;
            
    }
};
View Code
原文地址:https://www.cnblogs.com/daocaorenblog/p/5223163.html