读题

给定一个数组和目标整型值,求数组中任意三个数相加得到的结果最接近目标值。
解题
对数组依次遍历,遍历中定义两个索引,一个在最左侧,一个在最右侧,并向内移动。
左右两个索引在移动的过程中求出和,并判断是否接近目标值,如果更接近,赋值。
返回目标值。
代码如下,每一步都有详细的注释。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
public int threeSumClosest(int[] nums, int target) {
// 初始化 result
int result = nums[0] + nums[1] + nums[nums.length - 1];
// 使 nums 有序
Arrays.sort(nums);
// 遍历 nums
for (int i = 0; i < nums.length - 2; i++) {
// 定义左边的索引和右边的索引
int l = i + 1, r = nums.length - 1;
// 让左边的索引和右边的索引向内遍历
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
// 如果 sum 比 target 大,那就 r 向前,反之 l 向后
if (sum > target) {
r--;
} else {
l++;
}
// 判断 sum 是不是更接近目标值,如果更接近,赋值即可
if (Math.abs(target - sum) < Math.abs(target - result)) {
result = sum;
}
}
}
return result;
}
|
LeetCode 测试用例返回结果
