您的位置:首页 > 其它

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