解题思路
题目要求找到数组中a+b+c最接近target的和。思路和15题是类似的,也是排序采用二层遍历,计算出目标值c,用二分查找,如果找到就可以直接返回,如果没有找到,那就是找到插入的位置,计算该位置左右两边数字(假如存在)得到的和,看看是否存在更接近的和。
对于Java来说,Arrays.binarySearch对于没有匹配的情况,就可以支持返回应该插入的位置(用一个特定的负数表示)。
参考源码
public class Solution {
public int threeSumClosest(int[] num, int target) {
Arrays.sort(num);
int min = Integer.MAX_VALUE;
int t = target;
for (int i = 0; i < num.length - 2; i++) {
if (i > 0 && num[i] == num[i - 1]) {
continue;
}
int a = num[i];
for (int j = i + 1; j < num.length - 1; j++) {
if (j > i + 1 && num[j] == num[j - 1]) {
continue;
}
int b = num[j];
int c = target - (a + b);
int idx = Arrays.binarySearch(num, j + 1, num.length, c);
if (idx >= 0) {
return target;
}
int pos = -(idx + 1);
if (pos > j + 1) {
int tmpTarget = a + b + num[pos - 1];
int tmp = Math.abs(tmpTarget - target);
if (tmp < min) {
min = tmp;
t = tmpTarget;
}
}
if (pos < num.length) {
int tmpTarget = a + b + num[pos];
int tmp = Math.abs(tmpTarget - target);
if (tmp < min) {
min = tmp;
t = tmpTarget;
}
}
}
}
return t;
}
}