给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
解题思路:1.方法就是先排序一下给的数组,因为排序之后可以根据目前得到的sum和target比较来决定索引如何移动。
2.首先定义四个变量closestSum(最接近target的和),sum(当前三数之和),minMinus(sum和target最小的差值),minus(当前sum和target的差值),其次定义一个索引i=0,定义j=i+1,定义k=nums.length-1。i,j从前往后跑,k从后往前跑。
3.每组i,j,k都对应一个sum。当令minus = Math.abs(target-sum)算出当前的差值,如果这个差值小于minMinus。则说明当前sum更加接近targe。则closestSum=sum,minus=minMinus。
4.如果当前sum大于targe,就让k--,因为可能是k下标的那个数过大,反之则让j++,因为可能是j下标的那个数太小了。如果sum=target,那么不用继续比较了,因为都相等了,那么差值就等于0,不会有差值再小的了。
代码如下:
class Solution {
public int threeSumClosest(int[] nums, int target) {
if(nums ==null||nums.length<3) {
return 0;
}
Arrays.sort(nums);
int closestSum = 0;
int minMinus = Integer.MAX_VALUE;
int minus=0;
int sum = 0;
for (int i = 0; i < nums.length-2; i++) {
int j=i+1;
int k=nums.length-1;
while(j<k) {
sum = nums[i]+nums[j]+nums[k];
minus = Math.abs(target-sum);
if(minus<minMinus) {
closestSum=sum;
minus=minMinus;
}
if(sum>target) {
k--;
}else if(sum<target) {
j++;
}else {
return closestSum;
}
}
}
return closestSum;
}
}