给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
注意事项
只需要返回三元组之和,无需返回三元组本身
您在真实的面试中是否遇到过这个题?
Yes
样例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元组是 -1 + 2 + 1 = 2.
class Solution {
public:
/**
* @param numbers: Give an array numbers of n integer
* @param target: An integer
* @return: return the sum of the three integers, the sum closest target.
*/
int threeSumClosest(vector<int> nums, int target) {
// write your code here
int min_diff=abs(nums[0]+nums[1]+nums[2]-target);
int min_sum=nums[0]+nums[1]+nums[2];
int sum=0;
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();i++){
for(int j=i+1;j<nums.size();j++){
for(int z=j+1;z<nums.size();z++){
//第一次减枝 如果发现一个组合,diff=0,那么直接返回
if(min_diff==0){
return target;
}
sum=nums[i]+nums[j]+nums[z];
int diff=abs(sum-target);
//这里还可以再减一次枝
//因为他们是已经拍好的序列 如果当前已经大于diff,那么后面的已经没有必要遍历了
int flag=0;
if(sum-target>0){
flag=1;
}
else{
flag=-1;
}
if(diff<min_diff){
min_diff=diff;
min_sum=sum;
}
if(flag==1){
break;
}
}
}
}
return min_sum;
}
};