3.3个数之和最接近
给定n个整数的一个数组S,从S中找出3个数,其加和最接近一个给定
的数target
。返回这3个数的和。可以假设每一次输入都只有一个解决方案。
例如,给定数组S = {-1,2,1,-4}
,并且target = 1
。最接近target
的和是2
。(-1+2+1=2)
。
【解析】
这个是第2题“3个数之和”问题的扩展。解法和第2题类似,唯一的区别是在遍历的过程中,需要增加一个变量来记录遍历过程中的最小值,请见如 下粗体所示的代码。
【代码】
#include<bits/stdc++.h>
using namespace std;
int threeSumClosest(vector<int> &num,int target){
std::sort(num.begin(), num.end());
int len = num.size();
int minV = INT_MAX, record;
for (int i = 0; i < len;i++){
int start = i + 1;
int end = len - 1;
while(start<end){
int sum = num[i] + num[start] + num[end];
if(sum==target){
minV = 0;
record = sum;
break;
}
if (sum < target){
if (target - sum < minV){
minV = target - sum;
record = sum;
}
start++;
}
else{
if(sum-target<minV){
minV = sum - target;
record = sum;
}
end--;
}
}
if(record==target)
break;
while(i<len-1&&num[i]==num[i+1])
i++;
}
return record;
}
int main(){
vector<int> numbers = {-1, 2, 1, -4};
int target = 1;
int result = threeSumClosest(numbers,target);
cout << "最接近的数为:" << result << endl;
return 0;
}
【运行结果】
最接近的数为:2