这题的意思是,输入一个数组,找出其中和为0的三元组,注意这边的三元组不能重复。
如,给定一个数组 S = [-1, 0, 1, 2, -1, -4],
那么它的解应该为:[-1, 0, 1], [-1, -1, 2]
像这里[-1, 0, 1]和[0, 1, -1]是重复的,所以只能取其中一个。
因为不能有重复,所以先对数组进行排序来处理这个问题。在排序数组中依次不重复的选择一个数,这个数的反作为twoSum的目标数,这里依旧跳过重复数。排序数组遍历完则所有不重复的三元组就得到了。
具体实现如下:
class Solution {
public:
vector<vector<int>> twoSum(vector<int> nums,int end,int target)
{
int start=0;
vector<vector<int>> ret;
while(start<end)
{
if(nums[start]+nums[end]==target)
{
vector<int> curRet;
curRet.push_back(nums[start]);
curRet.push_back(nums[end]);
ret.push_back(curRet);
start++;
end--;
while(start<end&&nums[start]==nums[start-1])
{
start++;
}
while(start<end&&nums[end]==nums[end+1])
{
end--;
}
}
else if(nums[start]+nums[end]<target)
{
start++;
}
else
{
end--;
}
}
return ret;
}
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
if(nums.empty())
{
return result;
}
sort(nums.begin(),nums.end());
for(int i=nums.size()-1;i>=2;--i)
{
if(i<nums.size()-1&&nums[i]==nums[i+1])
{
continue;
}
vector<vector<int>> curRet=twoSum(nums,i-1,-nums[i]);
for(int j=0;j<curRet.size();++j)
{
curRet[j].push_back(nums[i]);
result.push_back(curRet[j]);
}
}
return result;
}
};