题目链接
解题思路
首先将数组nums排序,然后设置三个指针:指针i从头开始遍历数组,指针left从i+1处开始遍历数组,指针right从数组末尾往left处逼近。如下图所示

- 如果
nums[i] + nums[left] + nums[right] > 0,则说明三数之和大了,那么应该让right向左移动,直到left与right相遇 - 如果
nums[i] + nums[left] + nums[right] < 0,则说明三数之和小了,那么应该让left向右移动,直到left与right相遇 - 如果
nums[i] + nums[left] + nums[right] == 0,就记录下这三个数,继续寻找下一组符合条件的三元组
AC代码
//法一:基本的双指针法
class Solution {
public int threeSumClosest(int[] nums, int target) {
int ans = nums[0] + nums[1] + nums[2];
Arrays.sort(nums);
for (int i = 0; i < nums.length; i++) {
int left = i + 1;
int right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[left] + nums[right];
if (Math.abs(sum - target) < Math.abs(ans - target)) {
ans = sum;
}
if (sum > target) {
right--;
} else if (sum < target) {
left++;
} else {
return ans;
}
}
}
return ans;
}
}
#法2:双指针+减枝
class Solution {
public int threeSumClosest(int[] nums, int target) {
int ans = nums[0] + nums[1] + nums[2];
Arrays.sort(nums);
for (int i = 0; i < nums.length - 2; i++) {
int left = i + 1;
int right = nums.length - 1;
while (right > left) {
int sum = nums[i] + nums[left] + nums[right];
if (Math.abs(sum - target) < Math.abs(ans - target)) {
ans = sum;
}
if (sum > target) {
right--;
while (right > left && nums[right] == nums[right + 1]) {
right--;
}
} else if (sum < target) {
left++;
while (right > left && nums[left] == nums[left - 1]) {
left++;
}
} else {
return ans;
}
}
}
return ans;
}
}
本文提供了一种使用双指针法解决LeetCode上的3Sum Closest问题的方法,通过先排序再利用两个优化过的指针来寻找与目标值最接近的三数之和。
338

被折叠的 条评论
为什么被折叠?



