您的位置:首页 > 其它

Leetcode题解-3Sum&3Sum Closest

2017-11-12 22:30 295 查看

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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode