题目分析:
找三个数等于0, 三个数从小到大排列,结果集不要有重复。
排序后选取一个数x作为目标,在剩下的中找个两个数的和为-x,从两端向中间逼近。
剩下的问题就是去重
一般来说循环索引按照加加、减减变化,但是为了去重,不断加加或减减,直到跳过重复数字
如,-4, -1, -1, 0, 1, 2
当索引i指向-1后,索引不断加1,直到索引直到0,跳过重复的-1
时间复杂度:O(n*logn)+O(n*n) 注:排序+剩下的
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<vector<int> > res;
int i = 0;
while (i < nums.size())
{
int goal = -nums[i];
int j = i + 1;
int k = nums.size() - 1;
while (j < k)
{
if (nums[j] + nums[k] == goal)
{
vector<int> v;
v.push_back(nums[i]);
v.push_back(nums[j]);
v.push_back(nums[k]);
res.push_back(v);
while (nums[++j] == nums[j - 1]);
while (nums[--k] == nums[k + 1]);
}
else if (nums[j] + nums[k] < goal)
{
while (nums[++j] == nums[j - 1]);
}
else
{
while (nums[--k] == nums[k + 1]);
}
}
while (nums[++i] == nums[i - 1]);
}
return res;
}
};