题目描述
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
总结
left 和 right 的奇妙冒险
Sample Code
class Solution {
public int threeSumClosest(int[] nums, int target) {
// 排序
Arrays.sort(nums);
int closestNum = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length - 2; i++) {
int l = i + 1, r = nums.length - 1;
while (l < r){
int threeSum = nums[l] + nums[r] + nums[i];
if (Math.abs(threeSum - target) < Math.abs(closestNum - target)) {
closestNum = threeSum;
}
if (threeSum > target) {
r--;
} else if (threeSum < target) {
l++;
} else {
// 如果已经等于target的话, 肯定是最接近的
return target;
}
}
}
return closestNum;
}
}
ERROR Code
class Solution {
private int res = Integer.MAX_VALUE;
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
find(0, 0, 0, nums, target);
return res;
}
private void find(int sum, int len, int start, int[] nums, int target) {
if(res == target) return;
if(len == 3) {
if(Math.abs(target - res) > Math.abs(target - sum)) {
res = sum;
}
return;
}
for(int i = start; i < nums.length; i++) {
// if(i > start && nums[i] == nums[i-1]) continue;
find(sum+nums[i], len+1, i+1, nums, target);
}
}
}