leetcode-15.Three Sum
Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.
Note: The solution set must not contain duplicate triplets.
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
乍一看先想三层循环做,但是遇到了问题
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
//vector<int> res; 刚开始把vector定义在这里了,因为vector是拷贝构造,结果会越拖越长,不是按要求
vector<vector<int>> result;
for(int i = 0; i < nums.size(); ++i){
for(int j = i+1; j < nums.size(); ++j){
for(int k = j +1; k < nums.size(); ++k){
vector<int> res; //定义在这里才会每次循环生成一个
if(nums[i]+nums[j]+nums[k]==0){
res.push_back(nums[i]);
res.push_back(nums[j]);
res.push_back(nums[k]);
result.push_back(res);
break;
}
}
}
}
return result;
}
};
现在还是不对,因为没有办法去重
K-sum问题最好也就能做到O(n^(K-1))复杂度
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; //这里break完了就到哪里了--跳出for,k+1之后重新开始,如果所有的都大于0,就没有合适的组合
if(k > 0 && nums[k] == nums[k-1]) //这里为什么是-1,而不是+1?
//重点:处理的是第一次遇到的元素,因为你不知道后面还有没有了
//k>0是处理边界条件
continue; //这里为什么要是continue,而不是k++?
int i = k+1; //k是第一个<= 0的数的下标
int j = nums.size()-1;
int target = 0 - nums[k];
while(i < j){
if (nums[i] + nums[j] == target){
res.push_back({nums[k], nums[i], nums[j]}); //注意,可以这样写
while(nums[i] == nums[i+1])
i++;
while(nums[j] == nums[j-1])
j--; //把重复的先去掉
i++; //前后各往中间走一步
j--;
}
else if (nums[i] + nums[j] < target)
++i;
else
--j;
}
}
return res;
}
};