力扣 16.最接近的三数之和
题目介绍
解法
设 s=nums[i]+nums[j]+nums[k],为了判断 s 是不是与 target 最近的数,我们还需要用一个变量 minDiff 维护 ∣s−target∣ 的最小值。分类讨论:
-
如果 s=target,那么答案就是 s,直接返回 s。
-
如果 s>target,那么如果 s−target<minDiff,说明找到了一个与 target 更近的数,更新 minDiff 为 s−target,更新答案为 s。然后和三数之和一样,把 k 减一。
-
否则 s<target,那么如果 target−s<minDiff,说明找到了一个与 target 更近的数,更新 minDiff 为 target−s,更新答案为 s。然后和三数之和一样,把 j 加一。
代码如下:
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int minDiff = Integer.MAX_VALUE;//三数之和与target之差最小值(正数)
int ans = 0; //最后返回的三数之和
int n = nums.length;
for (int i = 0; i < n - 2; i++) {
int x = nums[i];
if (i > 0 && x == nums[i - 1]) continue; // 跳过重复数字
int l = i + 1;
int r = n - 1;
while (l < r) {
int sum = x + nums[l] + nums[r]; //三个数之和
if (sum > target) {
if (sum - target < minDiff ) { // s 与 target 更近
minDiff = sum - target;
ans = sum;
}
r--;
} else if (sum < target) {
if (target - sum < minDiff ) { // s 与 target 更近
minDiff = target - sum;
ans = sum;
}
l++;
} else {
return sum;
}
}
}
return ans;
}
}
原文地址:https://blog.csdn.net/qq_51352130/article/details/142306828
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!