Skip to content

Commit 536f05c

Browse files
authored
Merge pull request neetcode-gh#1299 from zim0369/3sum
Update 15-3sum.rs
2 parents ec6da5b + f298ab5 commit 536f05c

File tree

1 file changed

+53
-36
lines changed

1 file changed

+53
-36
lines changed

rust/15-3sum.rs

Lines changed: 53 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,61 @@
1+
use std::cmp::Ordering::{Equal, Greater, Less};
2+
13
impl Solution {
2-
pub fn three_sum(mut nums: Vec<i32>) -> Vec<Vec<i32>> {
3-
nums.sort_unstable();
4-
5-
let mut res = vec![];
6-
7-
for i in 0..nums.len() - 1{
8-
let n1 = nums[i];
9-
10-
if i > 0 && n1 == nums[i - 1]{
4+
pub fn three_sum(mut numbers: Vec<i32>) -> Vec<Vec<i32>> {
5+
numbers.sort_unstable();
6+
7+
let mut ans: Vec<Vec<i32>> = Vec::new();
8+
9+
for i in 0..numbers.len() {
10+
if i > 0 && numbers[i] == numbers[i - 1] {
1111
continue;
1212
}
13-
14-
let (mut l, mut r) = (i + 1, nums.len() - 1);
15-
16-
while l < r{
17-
let n2 = nums[l];
18-
let n3 = nums[r];
19-
20-
let sum = n1 + n2 + n3;
21-
22-
if sum > 0{
23-
r-=1;
24-
}else if sum < 0{
25-
l+=1;
26-
}else{
27-
res.push(vec![n1, n2, n3]);
28-
29-
while l < r && n2 == nums[l + 1]{
30-
l+=1;
31-
}
32-
l+=1;
33-
34-
while l < r && n3 == nums[r - 1]{
35-
r-=1;
13+
14+
let (mut l, mut r) = (i + 1, numbers.len() - 1);
15+
16+
while l < r {
17+
match (numbers[i] + numbers[l] + numbers[r]).cmp(&0) {
18+
Less => l += 1,
19+
Greater => r -= 1,
20+
Equal => {
21+
ans.push(vec![numbers[i], numbers[l], numbers[r]]);
22+
l += 1;
23+
while numbers[l] == numbers[l - 1] && l < r {
24+
l += 1;
25+
}
26+
r -= 1;
27+
while numbers[r] == numbers[r + 1] && l < r {
28+
r -= 1;
29+
}
3630
}
37-
r-=1;
3831
}
3932
}
4033
}
41-
42-
res
34+
35+
ans
4336
}
44-
}
37+
}
38+
39+
40+
41+
42+
43+
44+
45+
46+
47+
48+
49+
50+
51+
52+
53+
54+
55+
56+
57+
58+
59+
60+
61+

0 commit comments

Comments
 (0)