看题目的标题,和第一道Two Sum很像,实际上,也确实如此。
与求高阶矩阵的降阶、高次方程的降次、多元方程的消元手段类似,本题在确定一个数字后,剩下的问题就和第一道几乎一样了。
只是本题还需要注意,不能有重复的数字组合。由于题目并没有要求返回的每一组数字的顺序要按照原来相对位置,所以,为了方便,可以事先对数组进行排序,遍历时,检查一下和上一个元素是否相等。如果是,则直接跳过,否则开始取另外两个数,并判断三个数之和是否为零。
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
int first,low,high,n=nums.size();
if(n<3) return ans;
sort(nums.begin(),nums.end());
for(first=0;first<n-2;first++)
{
if(first>0 && nums[first]==nums[first-1]) continue;
low=first+1;
high=n-1;
while(low<high)
{
if(nums[first]+nums[low]+nums[high]==0)
{
vector<int> tmp;
tmp.push_back(nums[first]);
tmp.push_back(nums[low]);
tmp.push_back(nums[high]);
ans.push_back(tmp);
while(low<n-1 && nums[low]==nums[low+1]) low++;
while(high>0 && nums[high]==nums[high-1]) high--;
low++;
high--;
}
else if(nums[first]+nums[low]+nums[high]<0)
{
while(low<n-1 && nums[low]==nums[low+1]) low++;
low++;
}
else
{
while(high>0 && nums[high]==nums[high-1]) high--;
high--;
}
}
}
return ans;
}
};