https://leetcode.com/problems/3sum/
2sum:找到一组两元组,使得和为某个数
先排序,假设从小到大排序后,设头尾两个指针,若当前指针指向元素和小于零 则移动指针增大元素,反之大于零 则减小元素
3sum:找所有的三元组,使得三者和为零
n^2做法 先排序,固定一个点,将问题转化为2sum问题
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> ans;
sort(nums.begin(), nums.end());
vector<int>temp(3, 0);
for(int i = 0; i < nums.size(); i++){
if(i && nums[i] == nums[i - 1])
continue;//去重
int le = i + 1, ri = nums.size() - 1;
temp[0] = nums[i];
while(le < ri){
int sum = nums[i] + nums[le] + nums[ri];
if(sum < 0){
le++;
}
else if(sum > 0){
ri--;
}
else{
temp[1] = nums[le];
temp[2] = nums[ri];
ans.push_back(temp);
while(le < ri && nums[le] == temp[1]) le++;//去重
while(le < ri && nums[ri] == temp[2]) ri--;//去重
}
}
}
return ans;
}
};