LeetCode算法题——16. 3Sum Closest
2017-03-24 16:21
387 查看
题目:
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类似,采用的思想较为类似,可参照3Sum解法,略有不同的是,此题需要计算三个数的和与target最接近的组合,同理,可将三个数转换为两个数的和与target-第一个数最接近的组合。
C++实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int res;
bool flag=true;
int maxGap=100000;
for(int i=0;i<nums.size()&&flag;i++){
if(i>0&&nums[i]==nums[i-1])
continue;
int TwoSumtarget=target-nums[i];
int j=i+1;
int k=nums.size()-1;
while(j<k){
if(nums[j]+nums[k]==TwoSumtarget){
res=nums[j]+nums[k]+nums[i];
flag=false;
break;
}else if(nums[j]+nums[k]>TwoSumtarget){//两数之和大于目标值,则尾指针向前移动
if((nums[j]+nums[k]-TwoSumtarget)<maxGap){
maxGap=nums[j]+nums[k]-TwoSumtarget;
res=nums[j]+nums[k]+nums[i];
}
k--;
}else{
if((TwoSumtarget-nums[j]-nums[k])<maxGap){
maxGap=TwoSumtarget-nums[j]-nums[k];
res=nums[j]+nums[k]+nums[i];
}
j++;
}
}
}
return res;
}
};
int main(){
int result;
int d[4]={-1,2,1,-4};
vector<int> data;
for(int i=0;i<4;i++){
data.push_back(d[i]);
}
Solution sol;
result=sol.threeSumClosest(data,1);
cout<<result<<endl;
}
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类似,采用的思想较为类似,可参照3Sum解法,略有不同的是,此题需要计算三个数的和与target最接近的组合,同理,可将三个数转换为两个数的和与target-第一个数最接近的组合。
C++实现:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
int res;
bool flag=true;
int maxGap=100000;
for(int i=0;i<nums.size()&&flag;i++){
if(i>0&&nums[i]==nums[i-1])
continue;
int TwoSumtarget=target-nums[i];
int j=i+1;
int k=nums.size()-1;
while(j<k){
if(nums[j]+nums[k]==TwoSumtarget){
res=nums[j]+nums[k]+nums[i];
flag=false;
break;
}else if(nums[j]+nums[k]>TwoSumtarget){//两数之和大于目标值,则尾指针向前移动
if((nums[j]+nums[k]-TwoSumtarget)<maxGap){
maxGap=nums[j]+nums[k]-TwoSumtarget;
res=nums[j]+nums[k]+nums[i];
}
k--;
}else{
if((TwoSumtarget-nums[j]-nums[k])<maxGap){
maxGap=TwoSumtarget-nums[j]-nums[k];
res=nums[j]+nums[k]+nums[i];
}
j++;
}
}
}
return res;
}
};
int main(){
int result;
int d[4]={-1,2,1,-4};
vector<int> data;
for(int i=0;i<4;i++){
data.push_back(d[i]);
}
Solution sol;
result=sol.threeSumClosest(data,1);
cout<<result<<endl;
}
相关文章推荐
- 16. 3Sum Closest (python)
- Leetcode16. 3Sum Closest
- LeetCode-16. 3Sum Closest
- 16. 3Sum Closest
- leetcode16. 3Sum Closest
- leetcode 16. 3Sum Closest
- Leetcode16. 3Sum Closest
- LeetCode 16. 3Sum Closest
- 16. 3Sum Closest
- 16. 3Sum Closest
- LeetCode 16. 3Sum Closest
- LeetCode 16. 3Sum Closest
- 16. 3Sum Closest
- 16. 3Sum Closest
- 16. 3Sum Closest
- C#解leetcode 16. 3Sum Closest
- 16. 3Sum Closest
- 1. Two Sum && 167. Two Sum II - Input array is sorted && 15. 3Sum && 16. 3Sum Closest && 18. 4Sum
- leetcode_middle_99_16. 3Sum Closest
- [leetcode]16. 3Sum Closest