3Sum Closest

题意:给定一个整数数组和一个目标值target,找出一个三数组合,使它的和最接近target,并返回这个值。

16. 3Sum Closest (opens new window)

这题思路和3Sum类似,在遍历时计算最接近target的值并记录下来,取最大值。

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        // 先排序,从小到大遍历
        Arrays.sort(nums);
        int closestSum = Integer.MAX_VALUE;
        for (int i = 0; i < nums.length - 2; i++) {
            int left = i + 1;
            int right = nums.length - 1;
            while (left < right) {
                int sum = nums[i] + nums[left] + nums[right];
                // 如果相加刚好等于target,直接返回
                if (sum == target) {
                    return target;
                }
                if (Math.abs(target - sum) < Math.abs(target - closestSum)) {
                    closestSum = sum;
                }
                if (sum < target) {
                    left++;
                    // 跳过left相同的数字
                    while (nums[left] == nums[left - 1] && left < right) {
                        left++;
                    }
                } else {
                    right--;
                }
            }
        }
        return closestSum;
    }
}