Skip to content

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

+1
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

+1
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

+66-2
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

+64-2
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
### **...**
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
}
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)