题目描述:
给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
思路:和三数求和差不多,我们使用一个数组来记录从下标为i开始三数和最接近target的值,最后遍历这个数组找出最小的即可。
代码实现:
class Solution {
public int threeSumClosest(int[] nums, int target) {
//排序
Arrays.sort(nums);
//来存储下标从i开始的最接近的值
int[] temp = new int[nums.length];
int i=0;
//遍历开始
for(;i<nums.length-2;i++) {
if(i>0&&nums[i]>target) break;
int lo = i+1;int hi = nums.length-1;
//记录与目标值相差最小的值
Integer tt =null;
boolean v = false;
//在i+1~length-1中找与目标值相差最小的值
while(lo<hi) {
int tet = nums[hi]+nums[lo]+nums[i];
if(tt==null) tt = tet;
else {
tt = Math.abs(tet - target)<Math.abs(tt-target)?tet:tt;
}
if(tet>target) {
hi--;
while(nums[hi]==nums[hi+1]) {
if(hi<=lo) break;
hi--;
}
}else if(tet<target) {
lo++;
while(nums[lo]==nums[lo-1]) {
if(lo>=hi) break;
lo++;
}
}else {
v = true;
break;
}
}
if(v) return target;
//把与目标值相差最小的值存入数组
else temp[i] = tt;
}
//遍历数组查找最小值
int min = temp[0];
for(int j=1;j<i;j++) {
if(Math.abs(temp[j]-target)<Math.abs(min-target))
min = temp[j];
}
System.out.println(min);
return min;
}
}