16. 最接近的三数之和
给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1. 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
和15题类似,前提是要sort排序一下。还有就是如果三个数相加等于target那就直接输出,否则通过比较三个数之和与target差值的绝对值去更新res,得出的最终的res+target的三个数之和最接近的结果。
#include<iostream>
#include<vector>
#include<algorithm> //sort头文件
#include<stack>
#include<map>
using namespace std;
class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int add;
int res = nums[0]+nums[1]+nums[2]-target;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size()-2;i++){
if(i>0 && nums[i]==nums[i-1])
continue;
for(int j=i+1,k=nums.size()-1;j<k;){
add=nums[i]+nums[j]+nums[k];
//主要是计算res的值,所有的比较完成之后的res
res= abs(add-target)<abs(res) ?(add-target) :res;
if(add==target)
return add;
//因为要输入一个语句,所以加空括号即可
else if(add<target)
j++;
else
k--;
}
}
return target+res;
}
};
int main(){
int n,m,target;
cin>>n;
vector<int> nums;
for(int i=0;i<n;i++){
cin>>m;
nums.push_back(m);
}
cin>>target;
Solution solution;
cout<<solution.threeSumClosest(nums,target)<<endl;
system("pause");
}