Skip to content

Commit 9b27a14

Browse files
committed
feat: add solutions to lc problem: No.0015
No.0015.3Sum
1 parent 66d54be commit 9b27a14

File tree

4 files changed

+239
-0
lines changed

4 files changed

+239
-0
lines changed

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

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,89 @@ def three_sum(nums)
353353
end
354354
```
355355

356+
### **TypeScript**
357+
358+
```ts
359+
function threeSum(nums: number[]): number[][] {
360+
nums.sort((a, b) => a - b);
361+
const res = [];
362+
const n = nums.length;
363+
for (let i = 0; i < n - 2; i++) {
364+
if (nums[i] > 0) {
365+
break;
366+
}
367+
const target = 0 - nums[i];
368+
let l = i + 1;
369+
let r = n - 1;
370+
while (l < r) {
371+
if (nums[l] + nums[r] === target) {
372+
res.push([nums[i], nums[l], nums[r]]);
373+
l++;
374+
r--;
375+
while (nums[l] === nums[l - 1]) {
376+
l++;
377+
}
378+
while (nums[r] === nums[r + 1]) {
379+
r--;
380+
}
381+
} else if (nums[l] + nums[r] < target) {
382+
l++;
383+
} else {
384+
r--;
385+
}
386+
}
387+
while (nums[i] === nums[i + 1]) {
388+
i++;
389+
}
390+
}
391+
return res;
392+
}
393+
```
394+
395+
### **Rust**
396+
397+
```rust
398+
use std::cmp::Ordering;
399+
400+
impl Solution {
401+
pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
402+
nums.sort();
403+
let n = nums.len();
404+
let mut res = vec![];
405+
if n < 3 {
406+
return res;
407+
}
408+
let mut i = 0;
409+
while i < n - 2 && nums[i] <= 0 {
410+
let mut l = i + 1;
411+
let mut r = n - 1;
412+
while l < r {
413+
match (nums[i] + nums[l] + nums[r]).cmp(&0) {
414+
Ordering::Less => l += 1,
415+
Ordering::Greater => r -= 1,
416+
Ordering::Equal => {
417+
res.push(vec![nums[i], nums[l], nums[r]]);
418+
l += 1;
419+
r -= 1;
420+
while l < n && nums[l] == nums[l - 1] {
421+
l += 1;
422+
}
423+
while r > 0 && nums[r] == nums[r + 1] {
424+
r -= 1;
425+
}
426+
}
427+
}
428+
}
429+
i += 1;
430+
while i < n - 2 && nums[i] == nums[i - 1] {
431+
i += 1;
432+
}
433+
}
434+
res
435+
}
436+
}
437+
```
438+
356439
### **...**
357440

358441
```

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

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,89 @@ def three_sum(nums)
330330
end
331331
```
332332

333+
### **TypeScript**
334+
335+
```ts
336+
function threeSum(nums: number[]): number[][] {
337+
nums.sort((a, b) => a - b);
338+
const res = [];
339+
const n = nums.length;
340+
for (let i = 0; i < n - 2; i++) {
341+
if (nums[i] > 0) {
342+
break;
343+
}
344+
const target = 0 - nums[i];
345+
let l = i + 1;
346+
let r = n - 1;
347+
while (l < r) {
348+
if (nums[l] + nums[r] === target) {
349+
res.push([nums[i], nums[l], nums[r]]);
350+
l++;
351+
r--;
352+
while (nums[l] === nums[l - 1]) {
353+
l++;
354+
}
355+
while (nums[r] === nums[r + 1]) {
356+
r--;
357+
}
358+
} else if (nums[l] + nums[r] < target) {
359+
l++;
360+
} else {
361+
r--;
362+
}
363+
}
364+
while (nums[i] === nums[i + 1]) {
365+
i++;
366+
}
367+
}
368+
return res;
369+
}
370+
```
371+
372+
### **Rust**
373+
374+
```rust
375+
use std::cmp::Ordering;
376+
377+
impl Solution {
378+
pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
379+
nums.sort();
380+
let n = nums.len();
381+
let mut res = vec![];
382+
if n < 3 {
383+
return res;
384+
}
385+
let mut i = 0;
386+
while i < n - 2 && nums[i] <= 0 {
387+
let mut l = i + 1;
388+
let mut r = n - 1;
389+
while l < r {
390+
match (nums[i] + nums[l] + nums[r]).cmp(&0) {
391+
Ordering::Less => l += 1,
392+
Ordering::Greater => r -= 1,
393+
Ordering::Equal => {
394+
res.push(vec![nums[i], nums[l], nums[r]]);
395+
l += 1;
396+
r -= 1;
397+
while l < n && nums[l] == nums[l - 1] {
398+
l += 1;
399+
}
400+
while r > 0 && nums[r] == nums[r + 1] {
401+
r -= 1;
402+
}
403+
}
404+
}
405+
}
406+
i += 1;
407+
while i < n - 2 && nums[i] == nums[i - 1] {
408+
i += 1;
409+
}
410+
}
411+
res
412+
}
413+
}
414+
```
415+
333416
### **...**
334417

335418
```
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use std::cmp::Ordering;
2+
3+
impl Solution {
4+
pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
5+
nums.sort();
6+
let n = nums.len();
7+
let mut res = vec![];
8+
if n < 3 {
9+
return res;
10+
}
11+
let mut i = 0;
12+
while i < n - 2 && nums[i] <= 0 {
13+
let mut l = i + 1;
14+
let mut r = n - 1;
15+
while l < r {
16+
match (nums[i] + nums[l] + nums[r]).cmp(&0) {
17+
Ordering::Less => l += 1,
18+
Ordering::Greater => r -= 1,
19+
Ordering::Equal => {
20+
res.push(vec![nums[i], nums[l], nums[r]]);
21+
l += 1;
22+
r -= 1;
23+
while l < n && nums[l] == nums[l - 1] {
24+
l += 1;
25+
}
26+
while r > 0 && nums[r] == nums[r + 1] {
27+
r -= 1;
28+
}
29+
}
30+
}
31+
}
32+
i += 1;
33+
while i < n - 2 && nums[i] == nums[i - 1] {
34+
i += 1;
35+
}
36+
}
37+
res
38+
}
39+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
function threeSum(nums: number[]): number[][] {
2+
nums.sort((a, b) => a - b);
3+
const res = [];
4+
const n = nums.length;
5+
for (let i = 0; i < n - 2; i++) {
6+
if (nums[i] > 0) {
7+
break;
8+
}
9+
const target = 0 - nums[i];
10+
let l = i + 1;
11+
let r = n - 1;
12+
while (l < r) {
13+
if (nums[l] + nums[r] === target) {
14+
res.push([nums[i], nums[l], nums[r]]);
15+
l++;
16+
r--;
17+
while (nums[l] === nums[l - 1]) {
18+
l++;
19+
}
20+
while (nums[r] === nums[r + 1]) {
21+
r--;
22+
}
23+
} else if (nums[l] + nums[r] < target) {
24+
l++;
25+
} else {
26+
r--;
27+
}
28+
}
29+
while (nums[i] === nums[i + 1]) {
30+
i++;
31+
}
32+
}
33+
return res;
34+
}

0 commit comments

Comments
 (0)