题目链接:
https://leetcode.com/problems/3sum/description/
题解:
用二分的思想去做,先对所有的数字进行排序。然后优先确定一个数字,在对其他的两个数字直接二分就行了。这里对于重复的情况,我们可以使用set直接避免。
代码:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
set <vector<int> >res;
res.clear();
if(nums.size()==0)
return vector<vector<int>>(res.begin(), res.end());
sort(nums.begin(),nums.end());
for(int k=0;k<nums.size();k++)
{
if(nums[k]>0)
break;
int left=k+1,right=nums.size()-1;
int x=nums[k];
while(left<right)
{
int y=nums[left]+nums[right];
if(x+y==0)
{
res.insert({nums[k],nums[left],nums[right]});
while (left < right && nums[left] == nums[left+ 1])
left++;
while (left < right && nums[left] == nums[right- 1])
right--;
left++;
right--;
}
else if(x+y<0)
left++;
else
right--;
}
}
return vector<vector<int> >(res.begin(), res.end());
}
};