Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3304a40

Browse files
committed
feat: add python and java solutions to leetcode problem: No.0016
1 parent 32c64fb commit 3304a40

File tree

6 files changed

+188
-39
lines changed

6 files changed

+188
-39
lines changed

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
- [三数之和](/solution/0000-0099/0015.3Sum/README.md)
6060
- [四数之和](/solution/0000-0099/0018.4Sum/README.md)
6161
- [较小的三数之和](/solution/0200-0299/0259.3Sum%20Smaller/README.md)
62+
- [最接近的三数之和](/solution/0000-0099/0016.3Sum%20Closest/README.md)
6263
- [合并两个有序数组](/solution/0000-0099/0088.Merge%20Sorted%20Array/README.md)
6364
- [寻找旋转排序数组中的最小值](/solution/0100-0199/0153.Find%20Minimum%20in%20Rotated%20Sorted%20Array/README.md)
6465
- [寻找旋转排序数组中的最小值 II](/solution/0100-0199/0154.Find%20Minimum%20in%20Rotated%20Sorted%20Array%20II/README.md)

‎README_EN.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ Complete solutions to [LeetCode](https://leetcode-cn.com/problemset/all/), [LCOF
5858
- [3Sum](/solution/0000-0099/0015.3Sum/README_EN.md)
5959
- [4Sum](/solution/0000-0099/0018.4Sum/README_EN.md)
6060
- [3Sum Smaller](/solution/0200-0299/0259.3Sum%20Smaller/README_EN.md)
61+
- [3Sum Closest](/solution/0000-0099/0016.3Sum%20Closest/README_EN.md)
6162
- [Merge Sorted Array](/solution/0000-0099/0088.Merge%20Sorted%20Array/README_EN.md)
6263
- [Find Minimum in Rotated Sorted Array](/solution/0100-0199/0153.Find%20Minimum%20in%20Rotated%20Sorted%20Array/README_EN.md)
6364
- [Find Minimum in Rotated Sorted Array II](/solution/0100-0199/0154.Find%20Minimum%20in%20Rotated%20Sorted%20Array%20II/README_EN.md)

‎solution/0000-0099/0016.3Sum Closest/README.md‎

Lines changed: 66 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,86 @@
1616

1717
<!-- 这里可写通用的实现逻辑 -->
1818

19+
双指针解决。
20+
1921
<!-- tabs:start -->
2022

2123
### **Python3**
2224

2325
<!-- 这里可写当前语言的特殊实现逻辑 -->
2426

2527
```python
26-
28+
class Solution:
29+
def threeSumClosest(self, nums: List[int], target: int) -> int:
30+
def twoSumClosest(nums, start, end, target):
31+
res = 0
32+
diff = 10000
33+
while start < end:
34+
val = nums[start] + nums[end]
35+
if val == target:
36+
return val
37+
if abs(val - target) < diff:
38+
res = val
39+
diff = abs(val - target)
40+
if val < target:
41+
start += 1
42+
else:
43+
end -= 1
44+
return res
45+
46+
nums.sort()
47+
res, n = 0, len(nums)
48+
diff = 10000
49+
for i in range(n - 2):
50+
t = twoSumClosest(nums, i + 1, n - 1, target - nums[i])
51+
if abs(nums[i] + t - target) < diff:
52+
res = nums[i] + t
53+
diff = abs(nums[i] + t - target)
54+
return res
2755
```
2856

2957
### **Java**
3058

3159
<!-- 这里可写当前语言的特殊实现逻辑 -->
3260

3361
```java
34-
62+
class Solution {
63+
public int threeSumClosest(int[] nums, int target) {
64+
Arrays.sort(nums);
65+
int res = 0;
66+
int n = nums.length;
67+
int diff = Integer.MAX_VALUE;
68+
for (int i = 0; i < n - 2; ++i) {
69+
int t = twoSumClosest(nums, i + 1, n - 1, target - nums[i]);
70+
if (Math.abs(nums[i] + t - target) < diff) {
71+
res = nums[i] + t;
72+
diff = Math.abs(nums[i] + t - target);
73+
}
74+
}
75+
return res;
76+
}
77+
78+
private int twoSumClosest(int[] nums, int start, int end, int target) {
79+
int res = 0;
80+
int diff = Integer.MAX_VALUE;
81+
while (start < end) {
82+
int val = nums[start] + nums[end];
83+
if (val == target) {
84+
return val;
85+
}
86+
if (Math.abs(val - target) < diff) {
87+
res = val;
88+
diff = Math.abs(val - target);
89+
}
90+
if (val < target) {
91+
++start;
92+
} else {
93+
--end;
94+
}
95+
}
96+
return res;
97+
}
98+
}
3599
```
36100

37101
### **...**

‎solution/0000-0099/0016.3Sum Closest/README_EN.md‎

Lines changed: 64 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,75 @@ The sum that is closest to the target is 2. (-1 + 2 + 1 = 2).
2525
### **Python3**
2626

2727
```python
28-
28+
class Solution:
29+
def threeSumClosest(self, nums: List[int], target: int) -> int:
30+
def twoSumClosest(nums, start, end, target):
31+
res = 0
32+
diff = 10000
33+
while start < end:
34+
val = nums[start] + nums[end]
35+
if val == target:
36+
return val
37+
if abs(val - target) < diff:
38+
res = val
39+
diff = abs(val - target)
40+
if val < target:
41+
start += 1
42+
else:
43+
end -= 1
44+
return res
45+
46+
nums.sort()
47+
res, n = 0, len(nums)
48+
diff = 10000
49+
for i in range(n - 2):
50+
t = twoSumClosest(nums, i + 1, n - 1, target - nums[i])
51+
if abs(nums[i] + t - target) < diff:
52+
res = nums[i] + t
53+
diff = abs(nums[i] + t - target)
54+
return res
2955
```
3056

3157
### **Java**
3258

3359
```java
34-
60+
class Solution {
61+
public int threeSumClosest(int[] nums, int target) {
62+
Arrays.sort(nums);
63+
int res = 0;
64+
int n = nums.length;
65+
int diff = Integer.MAX_VALUE;
66+
for (int i = 0; i < n - 2; ++i) {
67+
int t = twoSumClosest(nums, i + 1, n - 1, target - nums[i]);
68+
if (Math.abs(nums[i] + t - target) < diff) {
69+
res = nums[i] + t;
70+
diff = Math.abs(nums[i] + t - target);
71+
}
72+
}
73+
return res;
74+
}
75+
76+
private int twoSumClosest(int[] nums, int start, int end, int target) {
77+
int res = 0;
78+
int diff = Integer.MAX_VALUE;
79+
while (start < end) {
80+
int val = nums[start] + nums[end];
81+
if (val == target) {
82+
return val;
83+
}
84+
if (Math.abs(val - target) < diff) {
85+
res = val;
86+
diff = Math.abs(val - target);
87+
}
88+
if (val < target) {
89+
++start;
90+
} else {
91+
--end;
92+
}
93+
}
94+
return res;
95+
}
96+
}
3597
```
3698

3799
### **...**
Lines changed: 29 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,37 @@
11
class Solution {
22
public int threeSumClosest(int[] nums, int target) {
33
Arrays.sort(nums);
4-
int bestAns = 100000;
5-
for (int i = 0;i + 2 < nums.length;i++) {
6-
if (i != 0 && nums[i] == nums[i - 1]) {
7-
continue;
4+
int res = 0;
5+
int n = nums.length;
6+
int diff = Integer.MAX_VALUE;
7+
for (int i = 0; i < n - 2; ++i) {
8+
int t = twoSumClosest(nums, i + 1, n - 1, target - nums[i]);
9+
if (Math.abs(nums[i] + t - target) < diff) {
10+
res = nums[i] + t;
11+
diff = Math.abs(nums[i] + t - target);
812
}
9-
int j = i + 1, k = nums.length - 1;
10-
while (j < k) {
11-
int sum = nums[i] + nums[j] + nums[k];
12-
if (sum == target) {
13-
return sum;
14-
}
15-
if (Math.abs(target - bestAns) > Math.abs(target - sum)) {
16-
bestAns = sum;
17-
}
18-
if (sum > target) {
19-
int k0 = k - 1;
20-
while (j < k0 && nums[k] == nums[k0]) {
21-
k0--;
22-
}
23-
if (j == k0) {
24-
break;
25-
} else {
26-
k = k0;
27-
}
28-
} else {
29-
int j0 = j + 1;
30-
while (j0 < j && nums[j] == nums[j0]) {
31-
j0++;
32-
}
33-
if (j0 == k) {
34-
break;
35-
} else {
36-
j = j0;
37-
}
38-
}
13+
}
14+
return res;
15+
}
16+
17+
private int twoSumClosest(int[] nums, int start, int end, int target) {
18+
int res = 0;
19+
int diff = Integer.MAX_VALUE;
20+
while (start < end) {
21+
int val = nums[start] + nums[end];
22+
if (val == target) {
23+
return val;
24+
}
25+
if (Math.abs(val - target) < diff) {
26+
res = val;
27+
diff = Math.abs(val - target);
28+
}
29+
if (val < target) {
30+
++start;
31+
} else {
32+
--end;
3933
}
4034
}
41-
return bestAns;
35+
return res;
4236
}
4337
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution:
2+
def threeSumClosest(self, nums: List[int], target: int) -> int:
3+
def twoSumClosest(nums, start, end, target):
4+
res = 0
5+
diff = 10000
6+
while start < end:
7+
val = nums[start] + nums[end]
8+
if val == target:
9+
return val
10+
if abs(val - target) < diff:
11+
res = val
12+
diff = abs(val - target)
13+
if val < target:
14+
start += 1
15+
else:
16+
end -= 1
17+
return res
18+
19+
nums.sort()
20+
res, n = 0, len(nums)
21+
diff = 10000
22+
for i in range(n - 2):
23+
t = twoSumClosest(nums, i + 1, n - 1, target - nums[i])
24+
if abs(nums[i] + t - target) < diff:
25+
res = nums[i] + t
26+
diff = abs(nums[i] + t - target)
27+
return res

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /