给定一个包括 n 个整数的数组 nums
和 一个目标值 target
。找出 nums
中的三个整数,使得它们的和与 target
最接近。返回这三个数的和。假定每组输入只存在唯一答案。
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
public class ThreeSumClosest {public static void main(String[] args) {int[] nums = { -1, 2, 1, -4 };System.out.println(threeSumClosest(nums, 1)); // 2}public static int threeSumClosest(int[] nums, int target) {int closestSum = 0, diff = Integer.MAX_VALUE; // 初始化最接近的三个数的和 及 与目标值的差值(绝对值)Arrays.sort(nums); // 对数组排序for (int k = 0; k < nums.length - 2; k++) { // 第一个数的索引int i = k + 1, j = nums.length - 1; // 第二个和第三个数的索引while (i < j) {int sumTemp = nums[k] + nums[i] + nums[j]; // 当前的三数之和int diffTemp = Math.abs(target - sumTemp); // 当前三数之和与目标值差值的绝对值if (diffTemp < diff) { // 如果差值绝对值小于之前的,则更新最接近的三个数的和 及 与目标值的差值(绝对值)closestSum = sumTemp;diff = diffTemp;}if (sumTemp > target) { // 如果三数之和大于目标值,则减小最大的第三个数j--;} else if (sumTemp < target) { // 如果三数之和小于目标值,则增大的第二个数i++;} else {return target; // 如果和目标值相等,那当然就是最接近的三数之和了}}}return closestSum;}}