描述
给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
只需要返回三元组之和,无需返回三元组本身
样例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元组是 -1 + 2 + 1 = 2.
挑战
给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。
只需要返回三元组之和,无需返回三元组本身
样例
例如 S = [-1, 2, 1, -4] and target = 1. 和最接近 1 的三元组是 -1 + 2 + 1 = 2.
挑战
O(n^2) 时间, O(1) 额外空间。
分析
该题目比求三数之和要简单很多,因为不需要考虑重复的数组,而且最接近的三数之和,可以理解为与目标值相等或者不相等,当然这里相等时最好的,我们只需要返回相等之和;如果不相等,我们记录每次求和与目标值之差最小的那个数,最后返回即可。
程序
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> &numbers, int target) {
// write your code here
//最接近并没有说一定相等
sort(numbers.begin(), numbers.end());
int tar = INT_MAX;
for(int i = 0; i < numbers.size(); i++){
for(int j = i+1, k = numbers.size() - 1; j < k;){
int sum = numbers[i]+numbers[j]+numbers[k];
tar = (abs(sum-target) < abs(tar-target))?sum:tar;
if(sum < target)
j++;
else if(sum > target)
k--;
else
return sum;
}
}
return tar;
}
};