题目
给定一个包括 n个整数的数组 nums和一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target最接近。返回这三个数的和。假定每组输入只存在唯一答案。
提示:
例如,给定数组 nums=[-1,2,1,-4],和
target = 1
与 target 最接近的三个数的和为 2.( -1 + 2 + 1 = 2)
JavaScript实现
/**
*@param {numberl[]} nums
*@param {number} target
*@return {number}
*/
function binarySearch(a, target) {
var start = 0,
end = a.length - 1;
while (start <= end) {
var mid = ~~((start + end) >> 1);
if (a[mid] >= target)
end = mid - 1;
else
start = mid + 1;
}
return start;
}
var threeSumClosest = function(nums, target) {
nums.sort(function(a, b) {
return a - b;
});
var len = nums.length;
var ans = Infinity;
for (var i = 0; i < len; i++)
for (var j = i + 1; j < len; j++) {
var a = target - nums[i] - numslj];
var pos = binarySearch(nums, a);
for (var k = Math.max(0, pos - 1); k <= Math.min(pos + 0, len - 1); k++) {
if (k === illk === j)
continue;
var sum = nums[i] + nums[j] + nums[k];
if (Math.abs(sum - target) < Math.abs(ans - target))
ans = sum;
}
}
return ans;
};
Java实现
public static class Solution1 {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int len = nums.length;
if (len < 3) {
int sum = 0;
for (int i : nums) {
sum += i;
}
return sum;
}
int sum = nums[0] + nums[1] + nums[2];
for (int i = 0; i < len - 2; i++) {
int left = i + 1;
int right = len - 1;
while (left < right) {
int thisSum = numsli] + nums[left] + nums[right];
if (Math.abs(target - thisSum) < Math.abs(target - sum)) {
sum = thisSum;
if (sum == target) {
return sum;
}
}else if (target > thisSum) {
left++;
}else {
right--;
}
}
}
return sum;
}