题目
三重循环 + 双指针
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
Main main = new Main();
int [] nums = new int[] {-1, 2, 1, -4};
main.threeSumClosest(nums, 1);
}
public int threeSumClosest(int[] nums, int target) {
int length = nums.length;
// 对数组排序
Arrays.sort(nums);
int ans = 0;
int min = Integer.MAX_VALUE;
for (int i = 0; i < length; i ++) {
int j = i + 1;
int k = length - 1;
while (k > j) {
if (Math.abs(nums[i] + nums[j] + nums[k] - target) < min) {
min = Math.abs(nums[i] + nums[j] + nums[k] - target);
ans = nums[i] + nums[j] + nums[k];
}
if (nums[i] + nums[j] + nums[k] > target) {
// 移动右指针, 缩小三数之和
k --;
} else if (nums[i] + nums[j] + nums[k] < target) {
// 移动左指针, 增大三数之和
j ++;
} else if (nums[i] + nums[j] + nums[k] == target) {
return target;
}
}
}
return ans;
}
}
基本思路
-
对数组排序, 使得循环可以优化
-
当i确定时, j, k的指针指向剩余数组的两端, 当nums[i] + nums[j] + nums[k] > target的时候, 缩小k, 减少三数之和, 反之增大j.
-
遇见三数之和 == target的时候, 可以直接返回