题目
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.
给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。算法
这个题目比较简单,就是维护一个三个数和目标值相差的绝对值最小的数,这个绝对值表示三个数的和到目标数的距离
public int threeSumClosest(int[] num, int target) {
// write your code here
if (num == null || num.length <= 2) {
return Integer.MIN_VALUE;
}
Arrays.sort(num);
int closest = num[0] + num[1] + num[2] - target; // 初始与目标最接近的
for (int i = 0; i < num.length - 2; i++) {
int diff = twoSum(num, i+1, target - num[i]);
if (Math.abs(diff) < Math.abs(closest)) { // 比较原始值和刚算得值
closest = diff;
}
}
return closest + target;
}
public int twoSum(int[] num, int start, int target) {
int closest = num[start] + num[start + 1] - target;
int l = start;
int r = num.length - 1;
while (l < r) {
int diff = num[l] + num[r] - target;
if (diff == 0) {
return 0;
}
if (Math.abs(diff) < Math.abs(closest)) {
closest = diff;
}
if(num[l] + num[r] > target) {
r--;
} else {
l++;
}
}
return closest;
}