方法如下:
先排序,外部循环 i 从 0 到 nums.size()-2;
内部循环 j 从 i+1始,k从nums.size()-1始;
如果发现nums[ j ] +nums[ k ] == - num[ i ],在num[ i ],nums[ j ],nums[ k ] 这三个数构成的数组和已经得到的满足条件的任一数组都不重复的情况下,把它pushback进入res;
其中issame()是一个判断两个数组是否相同的函数;
其中需要强调一点,我们是在得到一个满足a+b+c=0的temp时,再去判断它和已有的数组是否重复了,这是可以的;但如果我们在一开始就把nums数组的所有重复元素删除,按照我们的算法 是不是res里面 就永远不会出现重复的数组呢?
答案是肯定的,大家可以结合“ nums经过了排序 和 我们的算法思路 ” 这两点 很容易想明白;
但是设想这样一组输入:nums = { -4, -2, -2, -2, 0, 1, 2, 2, 2, 3, 3, 4, 4, 6, 6 };
如果我们 sort 后删除了nums的所有重复元素,那么-2,-2,4这一组结果 将永远得不到;
因此,我也只能依照算法中的 排除重复 的方法行事;
代码如下:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<int> temp;
vector<vector<int>> res; //最终返回结果
if (nums.size()<=2)
return res; //不足三个数时
sort(nums.begin(), nums.end());
int i, j, k;
for (i = 0; i < nums.size() - 2; i++)
{
j = i + 1; k = nums.size() - 1;
while (j < k)
{
if (nums[j] + nums[k] == -nums[i]) //符合a+b+c=0时
{
temp = { nums[i], nums[j++], nums[k--] }; //j++,k-- 继续判断
bool nosame = 1; //先假定res里面 没有和temp重复的数组
for (int t = 0; t < res.size(); t++)
{
if (issame(res[t], temp))
nosame = 0; //发现重复数组
}
if(nosame)
res.push_back(temp);
}
else if (nums[j] + nums[k] < -nums[i]) //b+c 稍小时
j++;
else k--; //b+c稍大时
}
}
return res;
}
bool issame(vector<int> &nums1, vector<int> &nums2) //判断两个数组是否相同;
{
if (nums1.size() != nums2.size())
return 0;
for (int i = 0; i < nums1.size(); i++)
if (nums1[i] != nums2[i])
return 0;
return 1;
}
};