此题可以将问题一分为二,共有三个数,先确定一个数a,剩下的就是找到两个数的和为-a。
需要注意的是,因为题中给的一维数组中会有重复的数值出现,且最终要求集合中的元素是按照递增排列,因此,首先需要将一维数组排序且在搜索过程中去除重复的元素。
代码
class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
vector<vector<int> > res;
int len = num.size();
if(len<=2)
return res;
sort(num.begin(), num.end());
for(int i = 0; i < len-2; ++i)
{
if(i>0&&num[i]==num[i-1])
continue;
threeSumHelper(res, num, i+1, 0-num[i]);
}
return res;
}
void threeSumHelper(vector<vector<int> > &res, vector<int> &num, int start, int sum)
{
int left = start;
int right = num.size()-1;
while(left < right)
{
if(num[left]+num[right]==sum)
{
vector<int> tempRes;
tempRes.push_back(num[start-1]);
tempRes.push_back(num[left]);
tempRes.push_back(num[right]);
res.push_back(tempRes);
int k = left+1;
while(k<right&&num[k]==num[left])
++k;
left = k;
k = right-1;
while(k>left&&num[k]==num[right])
--k;
right = k;
}
else if(num[left]+num[right]>sum)
right--;
else
left++;
}
}
};