ps:题目来自力扣
最接近的三数之和
给你一个长度为 n
的整数数组 nums
和 一个目标值 target
。请你从 nums
中选出三个整数,使它们的和与 target
最接近。
返回这三个数的和。
假定每组输入只存在恰好一个解。
import java.util.Arrays;
class Solution {
public int threeSumClosest(int[] nums, int target) {
// 首先对数组进行排序,方便后续使用双指针法
Arrays.sort(nums);
int n = nums.length;
// 初始化最接近的和为数组前三个元素的和
int closestSum = nums[0] + nums[1] + nums[2];
// 遍历数组,固定第一个数
for (int i = 0; i < n - 2; i++) {
int left = i + 1;
int right = n - 1;
while (left < right) {
// 计算当前三个数的和
int currentSum = nums[i] + nums[left] + nums[right];
// 如果当前和等于目标值,直接返回该和
if (currentSum == target) {
return currentSum;
}
// 比较当前和与目标值的距离和之前最接近和与目标值的距离
if (Math.abs(currentSum - target) < Math.abs(closestSum - target)) {
closestSum = currentSum;
}
// 根据当前和与目标值的大小关系移动指针
if (currentSum < target) {
left++;
} else {
right--;
}
}
}
return closestSum;
}
}
代码解释
本题要求从给定的整数数组 nums
中选出三个整数,使它们的和与目标值 target
最接近,并返回这三个数的和。我们可以采用排序加双指针的方法来解决。
具体步骤
- 数组排序:
- 使用
Arrays.sort(nums)
对数组进行排序,这样便于后续使用双指针法调整元素组合。
- 使用
- 初始化最接近的和:
- 把
closestSum
初始化为数组前三个元素的和,后续会不断更新它。
- 把
- 遍历数组固定第一个数:
- 通过
for
循环遍历数组,直到倒数第三个元素,固定nums[i]
作为三个数中的第一个数。
- 通过
- 双指针查找另外两个数:
- 初始化左指针
left
为i + 1
,右指针right
为数组的最后一个元素。 - 在
while
循环中,只要left
小于right
就继续:- 计算当前三个数的和
currentSum
。 - 如果
currentSum
等于target
,直接返回currentSum
。 - 比较
currentSum
与target
的距离和closestSum
与target
的距离,若currentSum
更接近,则更新closestSum
。 - 根据
currentSum
与target
的大小关系移动指针:- 若
currentSum
小于target
,将left
指针右移以增大和。 - 若
currentSum
大于target
,将right
指针左移以减小和。
- 若
- 计算当前三个数的和
- 初始化左指针
- 返回结果:
- 遍历结束后,
closestSum
即为最接近目标值的三个数的和,将其返回。
- 遍历结束后,