Skip to content

Commit fdada3c

Browse files
zhouboyi1998zhouboyi
authored andcommitted
docs(note): 添加题解:16. 最接近的三数之和
1 parent 15c77f7 commit fdada3c

File tree

2 files changed

+101
-0
lines changed

2 files changed

+101
-0
lines changed

markdown/hello/0000.Hello.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
| <span style="color: #FFB822;">**Medium**</span> | [**0012.整数转罗马数字**](../medium/0012.整数转罗马数字.md) |
1414
| <span style="color: #00AF9B;">**Easy**</span> | [**0013.罗马数字转整数**](../easy/0013.罗马数字转整数.md) |
1515
| <span style="color: #FFB822;">**Medium**</span> | [**0015.三数之和**](../medium/0015.三数之和.md) |
16+
| <span style="color: #FFB822;">**Medium**</span> | [**0016.最接近的三数之和**](../medium/0016.最接近的三数之和.md) |
1617
| <span style="color: #00AF9B;">**Easy**</span> | [**0020.有效的括号**](../easy/0020.有效的括号.md) |
1718
| <span style="color: #00AF9B;">**Easy**</span> | [**0021.合并两个有序链表**](../easy/0021.合并两个有序链表.md) |
1819
| <span style="color: #FFB822;">**Medium**</span> | [**0024.两两交换链表中的节点**](../medium/0024.两两交换链表中的节点.md) |
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<h1 style="text-align: center;"> <span style="color: #FFB822;">16. 最接近的三数之和</span> </h1>
2+
3+
### 🚀 LeetCode
4+
5+
<base target="_blank">
6+
7+
<span style="color: #FFB822;">**Medium**</span> [**https://leetcode.cn/problems/3sum-closest/**](https://leetcode.cn/problems/3sum-closest/)
8+
9+
---
10+
11+
### ❓ Description
12+
13+
<br/>
14+
15+
给你一个长度为 `n` 的整数数组 `nums` 和 一个目标值 `target`
16+
17+
请你从 `nums` 中选出三个整数,使它们的和与 `target` 最接近。
18+
19+
返回这三个数的和。
20+
21+
假定每组输入只存在恰好一个解。
22+
23+
<br/>
24+
25+
**示例 1:**
26+
27+
```
28+
输入: nums = [-1, 2, 1, -4], target = 1
29+
输出: 2
30+
解释: 与 target 最接近的和是 2 (-1 + 2 + 1 = 2)
31+
```
32+
33+
**示例 2:**
34+
35+
```
36+
输入: nums = [0, 0, 0], target = 1
37+
输出: 0
38+
解释: 与 target 最接近的和是 0 (0 + 0 + 0 = 0)
39+
```
40+
41+
<br/>
42+
43+
**提示:**
44+
45+
* `3 <= nums.length <= 1000`
46+
* `-1000 <= nums[i] <= 1000`
47+
* `-10^4 <= target <= 10^4`
48+
49+
---
50+
51+
### ❗ Solution
52+
53+
<br/>
54+
55+
#### idea
56+
57+
* 思路参考 [**0015.三数之和**](./0015.三数之和.md)
58+
59+
<br/>
60+
61+
#### Java
62+
63+
```
64+
class Solution {
65+
public int threeSumClosest(int[] nums, int target) {
66+
// 先将数组元素从小到大排序
67+
Arrays.sort(nums);
68+
int len = nums.length;
69+
70+
int result = 10000000;
71+
72+
int slow = 0;
73+
while (slow < len - 2) {
74+
int left = slow + 1;
75+
int right = len - 1;
76+
while (left < right) {
77+
int sum = nums[slow] + nums[left] + nums[right];
78+
if (sum < target) {
79+
left++;
80+
} else if (sum > target) {
81+
right--;
82+
} else {
83+
// 如果找到一组三数之和与目标值相等, 可以直接返回
84+
return sum;
85+
}
86+
// 判断当前的三数之和是否更接近目标值 (判断哪个差值的绝对值更小)
87+
if (Math.abs(target - sum) < Math.abs(target - result)) {
88+
result = sum;
89+
}
90+
}
91+
// 跳过与当前 slow 指向的数相等的数
92+
do {
93+
slow++;
94+
} while (slow < len - 2 && nums[slow] == nums[slow - 1]);
95+
}
96+
97+
return result;
98+
}
99+
}
100+
```

0 commit comments

Comments
 (0)