题目
Given an array S of n integers, find three integers in S such that the sum is closest to a given number, target. Return the sum of the three integers. You may assume that each input would have exactly one solution.
For example, given array S = {-1 2 1 -4}, and target = 1.
The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
题目描述
给定一个数组和一个目标数,找出三个数使得它们的和最贴近于目标数,返回该和。
思路
先将数组排序。然后固定一个数为i,另一个数为i+1,再另一个为length-1。根据情况移动后两个数,这样子,每次三个数的和sum增加或减少的距离将是最短的距离,这样就逐渐一点点逼近了target。也能得到三个和sum和target的最短距离。实在难以讲清楚,直接上代码理解吧。
AC代码
public int threeSumClosest(int[] nums, int target) {
if(nums == null || nums.length < 3) return 0;
Arrays.sort(nums);
int result = 0;
int minDist = (nums[0] + nums[1] + nums[nums.length-1] - target);
for(int i = 0; i < nums.length-2; i++){
if(i > 0 && nums[i] == nums[i-1])
continue;
int j = i +1;
int k = nums.length-1;
while(j < k){
int sum = nums[i] + nums[j] + nums[k];
if (sum < target){
if(target - sum < minDist){
minDist = target - sum;
result = sum;
}
++j;
}else if (sum > target){
if (sum - target < minDist){
minDist = sum - target;
result = sum;
}
--k;
}else{
return target;
}
}
}
return result;
}