Leetcode题解-3Sum&3Sum Closest
3Sum
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]
]
3Sum Closest
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
思路
3Sum就是在2Sum基础上套一层循环
3Sum Closest在3Sum基础上多声明一个变量来记录最靠近目标值的和
代码
3Sum
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> res;
//if(nums.size() < 3) return res;
std::sort(nums.begin(), nums.end());
cout << 1 << endl;
int l = nums.size();
for(int i = 0; i < l; i++){
int target = 0 - nums[i], front = i+1, back = l-1;
while(front < back){
if(nums[front] + nums[back] < target) front++;
else if(nums[front] + nums[back] > target) back--;
else{
vector<int> tem(3,0);
tem[0] = nums[i];
tem[1] = nums[front];
tem[2] = nums[back];
res.push_back(tem);
//用nums[front] == tem[1]不用nums[front] == nums[front+1]是因为nums[front+1]可能会越界
while(front < back && nums[front] == tem[1]) front++;
while(front < back && nums[back] == tem[2]) back--;
}
}
while(i+1 < l && nums[i] == nums[i+1]) i++;
}
return res;
}
};
3Sum Closest
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
if(nums.size() < 3) return 0;
int closest = nums[0]+nums[1]+nums[2];
sort(nums.begin(), nums.end());
for(int first = 0 ; first < nums.size()-2 ; ++first) {
if(first > 0 && nums[first] == nums[first-1]) continue;
int second = first+1;
int third = nums.size()-1;
while(second < third) {
int curSum = nums[first]+nums[second]+nums[third];
if(curSum == target) return curSum;
if(abs(target-curSum)<abs(target-closest)) {
closest = curSum;
}
if(curSum > target) {
--third;
} else {
++second;
}
}
}
return closest;
}
};