题目地址:
https://www.lintcode.com/problem/3sum-closest/description
给定一个数组,再给定一个数target,求数组中的三个数之和与target之差的绝对值最小,返回那个和。
思路是先排序,然后固定一个数,然后对剩余部分做对撞双指针即可。代码如下:
import java.util.Arrays;
public class Solution {
/**
* @param numbers: Give an array numbers of n integer
* @param target: An integer
* @return: return the sum of the three integers, the sum closest target.
*/
public int threeSumClosest(int[] numbers, int target) {
// write your code here
int res = numbers[0] + numbers[1] + numbers[2], minDiff = Math.abs(res - target);
Arrays.sort(numbers);
for (int i = 0; i < numbers.length - 2; i++) {
int l = i + 1, r = numbers.length - 1;
while (l < r) {
int sum = numbers[i] + numbers[l] + numbers[r];
// 如果得到了更小的距离,则更新最后答案,以及最小距离
if (Math.abs(sum - target) < minDiff) {
res = sum;
minDiff = Math.abs(sum - target);
}
// 如果和小于target,右指针左移不会得到更小的距离,所以左指针右移;
// 如果和大于target,则右指针左移;如果相等,最小和已经得到了,直接返回
if (sum < target) {
l++;
} else if (sum > target) {
r--;
} else {
return target;
}
}
}
return res;
}
}
时间复杂度 O ( n 2 ) O(n^2) O(n2),空间 O ( 1 ) O(1) O(1)。