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;
}
};
3sumclosest
找一个三元组 使得三数之和最接近目标值 思路和3sum相似
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int ans, dis = 0x3f3f3f3f;
sort(nums.begin(), nums.end());
for(int i = 0; i < nums.size(); i++){
int le = i + 1, ri = nums.size() - 1;
while(le < ri){
int sum = nums[i] + nums[le] + nums[ri];
if(abs(sum - target) < dis){
if(sum == target)
return sum;
ans = sum;
dis = abs(sum - target);
}
if(sum > target){
ri--;
}
else{
le++;
}
}
}
return ans;
}
};