Skip to content

Commit d6d52d8

Browse files
committed
feat: add solutions to lc problem: No.0016
No.0016.3Sum Closest
1 parent 69434b0 commit d6d52d8

File tree

12 files changed

+334
-324
lines changed

12 files changed

+334
-324
lines changed

solution/0000-0099/0013.Roman to Integer/README.md

+13-13
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ class Solution:
9898
romans = {'I': 1, 'V': 5, 'X': 10,
9999
'L': 50, 'C': 100, 'D': 500, 'M': 1000}
100100
ans = 0
101-
for i in range(len(s)-1):
102-
if romans[s[i]] < romans[s[i+1]]:
101+
for i in range(len(s) - 1):
102+
if romans[s[i]] < romans[s[i + 1]]:
103103
ans -= romans[s[i]]
104104
else:
105105
ans += romans[s[i]]
106-
return ans+romans[s[-1]]
106+
return ans + romans[s[-1]]
107107
```
108108

109109
### **Java**
@@ -173,16 +173,16 @@ public:
173173
174174
```go
175175
func romanToInt(s string) int {
176-
romans := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
177-
ans := 0
178-
for i := 0; i < len(s)-1; i++ {
179-
if romans[s[i]] < romans[s[i+1]] {
180-
ans -= romans[s[i]]
181-
} else {
182-
ans += romans[s[i]]
183-
}
184-
}
185-
return ans + romans[s[len(s)-1]]
176+
romans := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
177+
ans := 0
178+
for i := 0; i < len(s)-1; i++ {
179+
if romans[s[i]] < romans[s[i+1]] {
180+
ans -= romans[s[i]]
181+
} else {
182+
ans += romans[s[i]]
183+
}
184+
}
185+
return ans + romans[s[len(s)-1]]
186186
}
187187
```
188188

solution/0000-0099/0013.Roman to Integer/README_EN.md

+13-13
Original file line numberDiff line numberDiff line change
@@ -78,12 +78,12 @@ class Solution:
7878
romans = {'I': 1, 'V': 5, 'X': 10,
7979
'L': 50, 'C': 100, 'D': 500, 'M': 1000}
8080
ans = 0
81-
for i in range(len(s)-1):
82-
if romans[s[i]] < romans[s[i+1]]:
81+
for i in range(len(s) - 1):
82+
if romans[s[i]] < romans[s[i + 1]]:
8383
ans -= romans[s[i]]
8484
else:
8585
ans += romans[s[i]]
86-
return ans+romans[s[-1]]
86+
return ans + romans[s[-1]]
8787
```
8888

8989
### **Java**
@@ -151,16 +151,16 @@ public:
151151
152152
```go
153153
func romanToInt(s string) int {
154-
romans := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
155-
ans := 0
156-
for i := 0; i < len(s)-1; i++ {
157-
if romans[s[i]] < romans[s[i+1]] {
158-
ans -= romans[s[i]]
159-
} else {
160-
ans += romans[s[i]]
161-
}
162-
}
163-
return ans + romans[s[len(s)-1]]
154+
romans := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
155+
ans := 0
156+
for i := 0; i < len(s)-1; i++ {
157+
if romans[s[i]] < romans[s[i+1]] {
158+
ans -= romans[s[i]]
159+
} else {
160+
ans += romans[s[i]]
161+
}
162+
}
163+
return ans + romans[s[len(s)-1]]
164164
}
165165
```
166166

Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
func romanToInt(s string) int {
2-
romans := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
3-
ans := 0
4-
for i := 0; i < len(s)-1; i++ {
5-
if romans[s[i]] < romans[s[i+1]] {
6-
ans -= romans[s[i]]
7-
} else {
8-
ans += romans[s[i]]
9-
}
10-
}
11-
return ans + romans[s[len(s)-1]]
2+
romans := map[byte]int{'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
3+
ans := 0
4+
for i := 0; i < len(s)-1; i++ {
5+
if romans[s[i]] < romans[s[i+1]] {
6+
ans -= romans[s[i]]
7+
} else {
8+
ans += romans[s[i]]
9+
}
10+
}
11+
return ans + romans[s[len(s)-1]]
1212
}

solution/0000-0099/0013.Roman to Integer/Solution.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
class Solution:
22
def romanToInt(self, s: str) -> int:
3-
romans = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
3+
romans = {'I': 1, 'V': 5, 'X': 10,
4+
'L': 50, 'C': 100, 'D': 500, 'M': 1000}
45
ans = 0
56
for i in range(len(s) - 1):
67
if romans[s[i]] < romans[s[i + 1]]:

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

+107-80
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,11 @@
4343

4444
<!-- 这里可写通用的实现逻辑 -->
4545

46-
双指针解决。
46+
**方法一:排序 + 双指针**
47+
48+
将数组排序,然后遍历数组,对于每个元素 $nums[i]$,我们使用指针 $j$ 和 $k$ 分别指向 $i+1$ 和 $n-1$,计算三数之和,如果三数之和等于 $target$,则直接返回 $target$,否则根据与 $target$ 的差值更新答案。如果三数之和大于 $target$,则将 $k$ 向左移动一位,否则将 $j$ 向右移动一位。
49+
50+
时间复杂度 $O(n^2)$,空间复杂度 $O(\log n)$。其中 $n$ 为数组长度。
4751

4852
<!-- tabs:start -->
4953

@@ -54,31 +58,22 @@
5458
```python
5559
class Solution:
5660
def threeSumClosest(self, nums: List[int], target: int) -> int:
57-
def twoSumClosest(nums, start, end, target):
58-
res = 0
59-
diff = 10000
60-
while start < end:
61-
val = nums[start] + nums[end]
62-
if val == target:
63-
return val
64-
if abs(val - target) < diff:
65-
res = val
66-
diff = abs(val - target)
67-
if val < target:
68-
start += 1
69-
else:
70-
end -= 1
71-
return res
72-
7361
nums.sort()
74-
res, n = 0, len(nums)
75-
diff = 10000
76-
for i in range(n - 2):
77-
t = twoSumClosest(nums, i + 1, n - 1, target - nums[i])
78-
if abs(nums[i] + t - target) < diff:
79-
res = nums[i] + t
80-
diff = abs(nums[i] + t - target)
81-
return res
62+
n = len(nums)
63+
ans = inf
64+
for i, v in enumerate(nums):
65+
j, k = i + 1, n - 1
66+
while j < k:
67+
t = v + nums[j] + nums[k]
68+
if t == target:
69+
return t
70+
if abs(t - target) < abs(ans - target):
71+
ans = t
72+
if t > target:
73+
k -= 1
74+
else:
75+
j += 1
76+
return ans
8277
```
8378

8479
### **Java**
@@ -89,39 +84,86 @@ class Solution:
8984
class Solution {
9085
public int threeSumClosest(int[] nums, int target) {
9186
Arrays.sort(nums);
92-
int res = 0;
87+
int ans = 1 << 30;
9388
int n = nums.length;
94-
int diff = Integer.MAX_VALUE;
95-
for (int i = 0; i < n - 2; ++i) {
96-
int t = twoSumClosest(nums, i + 1, n - 1, target - nums[i]);
97-
if (Math.abs(nums[i] + t - target) < diff) {
98-
res = nums[i] + t;
99-
diff = Math.abs(nums[i] + t - target);
89+
for (int i = 0; i < n; ++i) {
90+
int j = i + 1, k = n - 1;
91+
while (j < k) {
92+
int t = nums[i] + nums[j] + nums[k];
93+
if (t == target) {
94+
return t;
95+
}
96+
if (Math.abs(t - target) < Math.abs(ans - target)) {
97+
ans = t;
98+
}
99+
if (t > target) {
100+
--k;
101+
} else {
102+
++j;
103+
}
100104
}
101105
}
102-
return res;
106+
return ans;
103107
}
108+
}
109+
```
104110

105-
private int twoSumClosest(int[] nums, int start, int end, int target) {
106-
int res = 0;
107-
int diff = Integer.MAX_VALUE;
108-
while (start < end) {
109-
int val = nums[start] + nums[end];
110-
if (val == target) {
111-
return val;
112-
}
113-
if (Math.abs(val - target) < diff) {
114-
res = val;
115-
diff = Math.abs(val - target);
116-
}
117-
if (val < target) {
118-
++start;
119-
} else {
120-
--end;
111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
int threeSumClosest(vector<int>& nums, int target) {
117+
sort(nums.begin(), nums.end());
118+
int ans = 1 << 30;
119+
int n = nums.size();
120+
for (int i = 0; i < n; ++i) {
121+
int j = i + 1, k = n - 1;
122+
while (j < k) {
123+
int t = nums[i] + nums[j] + nums[k];
124+
if (t == target) return t;
125+
if (abs(t - target) < abs(ans - target)) ans = t;
126+
if (t > target) -- k;
127+
else ++j;
121128
}
122129
}
123-
return res;
130+
return ans;
124131
}
132+
};
133+
```
134+
135+
### **Go**
136+
137+
```go
138+
func threeSumClosest(nums []int, target int) int {
139+
sort.Ints(nums)
140+
ans := 1 << 30
141+
n := len(nums)
142+
for i, v := range nums {
143+
j, k := i+1, n-1
144+
for j < k {
145+
t := v + nums[j] + nums[k]
146+
if t == target {
147+
return t
148+
}
149+
if abs(t-target) < abs(ans-target) {
150+
ans = t
151+
}
152+
if t > target {
153+
k--
154+
} else {
155+
j++
156+
}
157+
}
158+
}
159+
return ans
160+
}
161+
162+
func abs(x int) int {
163+
if x < 0 {
164+
return -x
165+
}
166+
return x
125167
}
126168
```
127169

@@ -134,43 +176,28 @@ class Solution {
134176
* @return {number}
135177
*/
136178
var threeSumClosest = function (nums, target) {
137-
let len = nums.length;
138179
nums.sort((a, b) => a - b);
139-
let diff = Infinity;
140-
let res;
141-
for (let i = 0; i < len - 2; i++) {
142-
if (i > 0 && nums[i] === nums[i - 1]) continue;
143-
let left = i + 1,
144-
right = len - 1;
145-
let cur = nums[i] + nums[i + 1] + nums[i + 2];
146-
if (cur > target) {
147-
let newDiff = Math.abs(cur - target);
148-
if (newDiff < diff) {
149-
diff = newDiff;
150-
res = cur;
180+
let ans = 1 << 30;
181+
const n = nums.length;
182+
for (let i = 0; i < n; ++i) {
183+
let j = i + 1;
184+
let k = n - 1;
185+
while (j < k) {
186+
const t = nums[i] + nums[j] + nums[k];
187+
if (t == target) {
188+
return t;
151189
}
152-
break;
153-
}
154-
while (left < right) {
155-
cur = nums[i] + nums[left] + nums[right];
156-
if (cur === target) return target;
157-
let newDiff = Math.abs(cur - target);
158-
if (newDiff < diff) {
159-
diff = newDiff;
160-
res = cur;
190+
if (Math.abs(t - target) < Math.abs(ans - target)) {
191+
ans = t;
161192
}
162-
if (cur < target) {
163-
while (nums[left] === nums[left + 1]) left++;
164-
left++;
165-
continue;
193+
if (t > target) {
194+
--k;
166195
} else {
167-
while (nums[right] === nums[right - 1]) right--;
168-
right--;
169-
continue;
196+
++j;
170197
}
171198
}
172199
}
173-
return res;
200+
return ans;
174201
};
175202
```
176203

0 commit comments

Comments
 (0)