1. 原题链接
https://leetcode.com/problems/3sum-closest/description/
2. 题目要求
数组S = nums[n]包含n个整数,找出S中三个整数a,b,c,使得a+b+c=sum,sum最接近给定的目标整数target,返回sum。
3. 解题思路
采用与第15题相同的思路(第15题链接),不过要引入两个整型变量min和result。
min用来保存当前sum和target的最小差值
result用来保存最小差值时的sum,最终的result也就是我们需要返回的结果。
当sum和target一致时,直接返回sum。
4. 代码实现
import java.util.Arrays; public class ThreeSumClosest { public static void main(String[] args) { int[] nums = {-1, 2, 1, 4}; System.out.println(ThreeSumClosest.threeSumClosest(nums, 1)); } public static int threeSumClosest(int[] nums, int target) { // 先进行排序 Arrays.sort(nums); int sum = 0, result = 0, min = Integer.MAX_VALUE; // min为target和sum之间的差值 for (int i = 0; i < nums.length - 2; i++) { int l = i + 1, r = nums.length - 1; if (i == 0 || (i > 0 && nums[i] != nums[i - 1])) { while (l < r) { sum = 0; // 将sum清零 sum = nums[i] + nums[l] + nums[r]; if (target - sum == 0) { // 如果直接与目标值相等,直接返回 return sum; } else if (target - sum > 0) { if ((target - sum) < min) { min = target - sum; result = sum; } while (l < r && nums[l] == nums[l + 1]) l++; // 跳过重复的值 l++; } else { if ((sum - target) < min) { min = sum - target; result = sum; } while (l < r && nums[r] == nums[r - 1]) r--; // 跳过重复的值 r--; } } } } return result; } }