题意: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.
思路:
先排序,两层循环,外层表示求和的第一个数,内层循环设两个游标,指向剩余数组中的首尾数,对其求和,根据结果判断左右游标的移动。
AC代码
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int> > ret;
if(nums.size() < 3){
return ret;
}
sort(nums.begin(), nums.end()); // -4 -1 -1 0 1 2
for(int i = 0; i < nums.size() - 2 && nums[i] <= 0; ++i){
if(i > 0 && nums[i] == nums[i-1] && nums[i] != 0) {
continue;
}
if(nums[i] == 0){
int count = 1;
while(nums[++i] == 0){
count ++;
}
if(count >2){
vector<int> zero(3, 0);
ret.push_back(zero);
return ret;
}
}
for(int p = i + 1, q = nums.size() - 1; p < q; ){
vector<int> tri;
if(nums[p] + nums[q] == (-1)* nums[i]){
if(p - 1 >= i + 1 && nums[p] == nums[p-1] && q + 1 <= nums.size()-1 && nums[q + 1] == nums[q]){
++ p;
-- q;
}else{
tri.push_back(nums[i]);
tri.push_back(nums[p]);
tri.push_back(nums[q]);
ret.push_back(tri);
++ p;
-- q;
}
}else if( nums[p] + nums[q] < (-1) * nums[i]){
++ p;
}else{
-- q;
}
}
}
return ret;
}
};