LeetCode 16.最接近的三数之和
题目:
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
思路:
代码:
class Solution {public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int n = nums.length;int ans = 0;int minDiff = Integer.MAX_VALUE;for (int i = 0; i < n - 2; i++) {int x = nums[i];// 优化三if (i > 0 && x == nums[i - 1]) {continue; }// 优化一int s = x + nums[i + 1] + nums[i + 2];if (s > target) { // 后面无论怎么选,选出的三个数的和不会比 s 还小if (s - target < minDiff) {ans = s; // 由于下面直接 break,这里无需更新 minDiff}break;}// 优化二s = x + nums[n - 2] + nums[n - 1];if (s < target) { // x 加上后面任意两个数都不超过 s,所以下面的双指针就不需要跑了if (target - s < minDiff) {minDiff = target - s;ans = s;}continue;}int j = i + 1;int k = n - 1;while (j < k) {s = nums[i] + nums[j] + nums[k];if (s == target) {return target;}if (s > target) {if (s - target < minDiff) {minDiff = s - target;ans = s;}k--;} else {if (target - s < minDiff) {minDiff = target - s;ans = s;}j++;}}}return ans;}
}
性能: