自己的解法:
先排序->分大于零和小于等于零两个部分->取任一一个部分中的两个数->再在另一个部分取一个数匹配是否等于0(0+0+0=0已单独讨论)
出现的问题:运行到311/313测试用例时出现TLE。
class Solution
{
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
set<vector<int>> v;
sort(nums.begin(), nums.end());
int block = -1;
int countZero=0;
for (int i = 0; i<nums.size(); i++)
{
if (nums[i]>0)
{
block = i;
break;
}
if(nums[i]==0)
countZero+=1;
}
if(countZero>=3)
{
v.insert({0,0,0});
}
for (int i = 0; i<block - 1; i++)
{
for (int j = i + 1; j<block; j++)
{
for (int k = block; k<nums.size(); k++)
{
if (nums[i] + nums[j] + nums[k] == 0)
{
v.insert({nums[i],nums[j],nums[k]});
break;
}
}
}
}
for (int i = block; i<nums.size() - 1; i++)
{
for (int j = i + 1; j<nums.size(); j++)
{
for (int k = 0; k<block; k++)
{
if (nums[i] + nums[j] + nums[k] == 0)
{
v.insert({nums[i],nums[j],nums[k]});
break;
}
}
}
}
return vector<vector<int>>(v.begin(),v.end());
}
};
对原数组进行排序,然后开始遍历排序后的数组,这里注意不是遍历到最后一个停止,而是到倒数第三个就可以了,然后我们还要加上重复就跳过的处理,对于遍历到的数,我们用0减去这个数得到一个sum,我们只需要再之后找到两个数之和等于sum即可,这样一来问题又转化为了求two sum,这时候我们一次扫描,找到了等于sum的两数后,加上当前遍历到的数字,按顺序存入结果中即可,然后还要注意跳过重复数字。代码如下:
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums)
{
vector<vector<int>> res;
sort(nums.begin(), nums.end());
for (int k = 0; k < nums.size(); ++k)
{
if (nums[k] > 0)
break;
if (k > 0 && nums[k] == nums[k - 1])
continue;
int target = 0 - nums[k];
int i = k + 1, j = nums.size() - 1;
while (i < j) {
if (nums[i] + nums[j] == target)
{
res.push_back({nums[k], nums[i], nums[j]});
while (i < j && nums[i] == nums[i + 1])
++i;
while (i < j && nums[j] == nums[j - 1])
--j;
++i;
--j;
}
else if (nums[i] + nums[j] < target)
++i;
else
--j;
}
}
return res;
}
};
参考自:https://www.cnblogs.com/grandyang/p/4481576.html
如有不当之处,请联系我:clark_lee0806@foxmail.com