题目
给定n个整数的一个数组S,在S中找出3个数,其加和最接近一个给定的数target,返回这3个数的和。可以假设每一次输入都只有一个解决方案。
例如,给定数组 S = {-1 2 1 -4},并且target = 1。最接近target的和是 2 。(-1+2+1=2)。
解析
本题又是第二天题“3个数之和”问题的拓展,解法和第二题类似,唯一的区别是在遍历的过程中,需要增加一个变量来记录遍历过程中的最小值。
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int threeSumClosest( vector< int > &num, int target){
sort(num.begin(), num.end());
int len = num.size();
int minV = INT_MAX, record; //存储minV最接近值,record记录加和
for(int i=0; i<len; i++)
{
int start = i + 1, end = len - 1;
while(start < end)
{
int sum = num[i] + num[start] + num[end];
if(sum == target) //加和等于target,minV为0
{
minV = 0;
record = sum;
break;
}
if(sum < target) //加和小于target,首指针++;
{
if(target-sum < minV)
{
minV = target - sum;
record = sum;
}
start++;
}
else //加和大于target,尾指针--;
{
if(sum-target < minV)
{
minV = sum - target;
record = sum;
}
end--;
}
}
if(record == target) break;
//去重 de-duplicate
while(i<len-1 && num[i] == num[i+1]) i++;
}
cout<<record<<endl;
return record;
}
//例如,给定数组 S = {-1 2 1 -4},并且target = 1。最接近target的和是 2 。(-1+2+1=2)。
void main(){
int nums[] = {-1,2,1,-4};
vector<int> v;
for(int i=0; i < sizeof(nums)/4; i++)
v.push_back(nums[i]);
threeSumClosest(v,1);
}