3Sum:给定一个数组,找出3个数字和为0的所有组合比如:
For example, given array S = [-1, 0, 1, 2, -1, -4],
A solution set is:
[
[-1, 0, 1],
[-1, -1, 2]
]
算法:排序数组,固定num1,首尾指针找num2,num3.如果和小于0,首指针向前,如果和大于0,尾指针向后。
ps:set用来去重真的好慢
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
if(nums.size() < 3)
return res;
//排序
sort(nums.begin(),nums.end());
//遍历到倒数第三个数
int last_num = nums.size()-2;
for (int i = 0; i < last_num; i++)
{
//去重
if(i>0)
if(nums[i] == nums[i-1])
continue;
//固定一个数//
int num1 = nums[i];
int start = i + 1;
int end = nums.size() - 1;
//首尾指针
while (start < end)
{
int num2 = nums[start];
int num3 = nums[end];
int sum_value = num1 + num2 + num3;
//找到3和为0//
if(sum_value == 0){
vector<int>line ;
line.push_back(num1);
line.push_back(num2);
line.push_back(num3);
res.push_back(line);
line.clear();
start++;
//去重
while (start<=end && nums[start] == nums[start-1])
{
start++;
}
}
else if(sum_value < 0){
start++;
//去重
while (start<=end && nums[start] == nums[start-1])
{
start++;
}
}
else{
end--;
//去重
while (start<=end && nums[end] == nums[end+1])
{
end--;
}
}
}
}
return res;
}
};