Skip to content

Commit cc5b48c

Browse files
committed
feat: update solutions to lc problem: No.0015. 3Sum
1 parent 90d0dd3 commit cc5b48c

File tree

7 files changed

+304
-257
lines changed

7 files changed

+304
-257
lines changed

solution/0000-0099/0015.3Sum/README.md

+87-60
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
<li><code>-10<sup>5</sup> <= nums[i] <= 10<sup>5</sup></code></li>
4343
</ul>
4444

45-
4645
## 解法
4746

4847
<!-- 这里可写通用的实现逻辑 -->
@@ -58,30 +57,29 @@
5857
```python
5958
class Solution:
6059
def threeSum(self, nums: List[int]) -> List[List[int]]:
61-
if nums is None or len(nums) < 3:
62-
return []
60+
n, res = len(nums), []
61+
if n < 3:
62+
return res
6363
nums.sort()
64-
n = len(nums)
65-
res = []
6664
for i in range(n - 2):
65+
if nums[i] > 0:
66+
break
6767
if i > 0 and nums[i] == nums[i - 1]:
6868
continue
69-
p, q = i + 1, n - 1
70-
while p < q:
71-
if p > i + 1 and nums[p] == nums[p - 1]:
72-
p += 1
73-
continue
74-
if q < n - 1 and nums[q] == nums[q + 1]:
75-
q -= 1
76-
continue
77-
if nums[i] + nums[p] + nums[q] < 0:
78-
p += 1
79-
elif nums[i] + nums[p] + nums[q] > 0:
80-
q -= 1
69+
j, k = i + 1, n - 1
70+
while j < k:
71+
if nums[i] + nums[j] + nums[k] == 0:
72+
res.append([nums[i], nums[j], nums[k]])
73+
j += 1
74+
k -= 1
75+
while j < n and nums[j] == nums[j - 1]:
76+
j += 1
77+
while k > i and nums[k] == nums[k + 1]:
78+
k -= 1
79+
elif nums[i] + nums[j] + nums[k] < 0:
80+
j += 1
8181
else:
82-
res.append([nums[i], nums[p], nums[q]])
83-
p += 1
84-
q -= 1
82+
k -= 1
8583
return res
8684
```
8785

@@ -92,34 +90,32 @@ class Solution:
9290
```java
9391
class Solution {
9492
public List<List<Integer>> threeSum(int[] nums) {
95-
int n;
96-
if (nums == null || (n = nums.length) < 3) {
93+
int n = nums.length;
94+
if (n < 3) {
9795
return Collections.emptyList();
9896
}
9997
Arrays.sort(nums);
10098
List<List<Integer>> res = new ArrayList<>();
101-
for (int i = 0; i < n - 2; ++i) {
99+
for (int i = 0; i < n - 2 && nums[i] <= 0; ++i) {
102100
if (i > 0 && nums[i] == nums[i - 1]) {
103101
continue;
104102
}
105-
int p = i + 1, q = n - 1;
106-
while (p < q) {
107-
if (p > i + 1 && nums[p] == nums[p - 1]) {
108-
++p;
109-
continue;
110-
}
111-
if (q < n - 1 && nums[q] == nums[q + 1]) {
112-
--q;
113-
continue;
114-
}
115-
if (nums[p] + nums[q] + nums[i] < 0) {
116-
++p;
117-
} else if (nums[p] + nums[q] + nums[i] > 0) {
118-
--q;
103+
int j = i + 1, k = n - 1;
104+
while (j < k) {
105+
if (nums[i] + nums[j] + nums[k] == 0) {
106+
res.add(Arrays.asList(nums[i], nums[j], nums[k]));
107+
++j;
108+
--k;
109+
while (j < n && nums[j] == nums[j - 1]) {
110+
++j;
111+
}
112+
while (k > i && nums[k] == nums[k + 1]) {
113+
--k;
114+
}
115+
} else if (nums[i] + nums[j] + nums[k] < 0) {
116+
++j;
119117
} else {
120-
res.add(Arrays.asList(nums[p], nums[q], nums[i]));
121-
++p;
122-
--q;
118+
--k;
123119
}
124120
}
125121
}
@@ -128,36 +124,67 @@ class Solution {
128124
}
129125
```
130126

127+
### **C++**
128+
129+
```cpp
130+
class Solution {
131+
public:
132+
vector<vector<int>> threeSum(vector<int>& nums) {
133+
int n = nums.size();
134+
if (n < 3) {
135+
return {};
136+
}
137+
sort(nums.begin(), nums.end());
138+
vector<vector<int>> res;
139+
for (int i = 0; i < n - 2 && nums[i] <= 0; ++i) {
140+
if (i > 0 && nums[i] == nums[i - 1]) continue;
141+
int j = i + 1, k = n - 1;
142+
while (j < k) {
143+
if (nums[i] + nums[j] + nums[k] == 0) {
144+
res.push_back({nums[i], nums[j], nums[k]});
145+
++j;
146+
--k;
147+
while (j < n && nums[j] == nums[j - 1]) ++j;
148+
while (k > i && nums[k] == nums[k + 1]) --k;
149+
} else if (nums[i] + nums[j] + nums[k] < 0) {
150+
++j;
151+
} else {
152+
--k;
153+
}
154+
}
155+
}
156+
return res;
157+
}
158+
};
159+
```
160+
131161
### **JavaScript**
132162
133163
```js
134164
/**
135165
* @param {number[]} nums
136166
* @return {number[][]}
137167
*/
138-
var threeSum = function (nums) {
139-
let len = nums.length;
140-
if (len < 3) return [];
168+
var threeSum = function(nums) {
169+
const n = nums.length;
170+
if (n < 3) return [];
141171
let res = [];
142172
nums.sort((a, b) => a - b);
143-
for (let i = 0; i < len - 2; i++) {
144-
if (nums[i] > 0) break;
145-
if (i > 0 && nums[i] === nums[i - 1]) continue;
146-
let left = i + 1, right = len - 1;
147-
while (left < right) {
148-
if (nums[i] + nums[left] + nums[right] === 0) {
149-
res.push([nums[i], nums[left], nums[right]]);
150-
while (nums[left] === nums[left + 1]) left++;
151-
left++;
152-
while (nums[right] === nums[right - 1]) right--;
153-
right--;
154-
continue;
155-
} else if (nums[i] + nums[left] + nums[right] > 0) {
156-
right--;
157-
continue;
173+
for (let i = 0; i < n - 2 && nums[i] <= 0; ++i) {
174+
if (i > 0 && nums[i] == nums[i - 1]) continue;
175+
let j = i + 1;
176+
let k = n - 1;
177+
while (j < k) {
178+
if (nums[i] + nums[j] + nums[k] === 0) {
179+
res.push([nums[i], nums[j], nums[k]]);
180+
++j;
181+
--k;
182+
while (nums[j] === nums[j - 1]) ++j;
183+
while (nums[k] === nums[k + 1]) --k;
184+
} else if (nums[i] + nums[j] + nums[k] < 0) {
185+
++j;
158186
} else {
159-
left++;
160-
continue;
187+
--k;
161188
}
162189
}
163190
}

0 commit comments

Comments
 (0)