Leetcode 16. 最接近的三數之和
阿新 • • 發佈:2020-12-28
思路:排序+雙指標
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int ans = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.length; i++) {
int l = i + 1, r = nums.length - 1;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (Math.abs(sum - target) < Math.abs(target - ans)){
ans = sum;
}
if (sum == target){
return sum;
}else if (sum < target){
l++ ;
}else{
r--;
}
}
}
return ans;
}
}
優化:排序後可能存在相等的值,可以直接跳過相等的值,注意指標移動的邊界條件
class Solution {
public int threeSumClosest(int[] nums, int target) {
Arrays.sort(nums);
int ans = nums[0] + nums[1] + nums[ 2];
for (int i = 0; i < nums.length; i++) {
// 保證和上一次列舉的元素不相等
if (i > 0 && nums[i] == nums[i - 1]){
continue;
}
int l = i + 1, r = nums.length - 1;
while (l < r){
int sum = nums[i]+ nums[l] + nums[r];
if (sum == target) return sum;
// 根據差值的絕對值來更新答案
if (Math.abs(target - sum) < Math.abs(target - ans)){
ans = sum;
}
if (sum < target){
// 如果sum小於target,移動 l 對應的指標
int l0 = l + 1;
while (l0 < r && nums[l0] == nums[l]){
// 移動到下一個不相等的元素
l0++;
}
l = l0;
}else {
// 如果sum大於target,移動 r 對應的指標
int r0 = r - 1;
while (l < r0 && nums[r] == nums[r0]){
r0--;
}
r = r0;
}
}
}
return ans;
}
}