16. 最接近的三数之和

leetcode链接:
https://leetcode.cn/problems/3sum-closest/description/

方案一

解题思路:排序 + 对撞指针;

注意点:

target 的正负问题
第一层for循环结束条件,一定要加上 i < nums.length - 2 防止程序编译报错

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
27
28
29
int result = nums[0] + nums[1] + nums[2] - target;
int left,right,flag;

Arrays.sort(nums);

for (int i = 0; nums[i] < Math.abs(target) && i < nums.length - 2; i++) {
left = i + 1;
right = nums.length -1;
while (left < right) {

flag = nums[i] + nums[left] + nums[right] - target;

if (flag > 0) {
right--;
if (flag < Math.abs(result)) {
result = flag;
}
} else if (flag == 0) {
return target;
} else {
left++;
if (flag < Math.abs(result)) {
result = flag;
}
}
}
}

return result + target;

几乎最优方案

https://leetcode.cn/problems/3sum-closest/solution/hua-jie-suan-fa-16-zui-jie-jin-de-san-shu-zhi-he-b/

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
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 start = i+1, end = nums.length - 1;
while(start < end) {
int sum = nums[start] + nums[end] + nums[i];
if(Math.abs(target - sum) < Math.abs(target - ans))
ans = sum;
if(sum > target)
end--;
else if(sum < target)
start++;
else
return ans;
}
}
return ans;
}
}

作者:guanpengchn
链接:https://leetcode.cn/problems/3sum-closest/solution/hua-jie-suan-fa-16-zui-jie-jin-de-san-shu-zhi-he-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

16. 最接近的三数之和
http://yuanql.top/2023/03/27/02_leetcode/16. 最接近的三数之和/
作者
Qingli Yuan
发布于
2023年3月27日
许可协议