思路:
先排序,从小到大。
三个数的加法,可以先确定一个数,剩下两个数在剩下的范围找,当总和比目标值大,就让最大的范围数减小,小就让最小的数增加。
注意几点就是:
第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; } };