Skip to content

Commit 325ccb6

Browse files
authoredJul 29, 2020
Merge pull request #4 from jtr109/refine-3-sum
Refine 3 sum
2 parents e03916e + 70e03f7 commit 325ccb6

File tree

1 file changed

+59
-18
lines changed

1 file changed

+59
-18
lines changed
 

‎three_sum/src/lib.rs

+59-18
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,80 @@ struct Solution {}
44

55
impl Solution {
66
pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
7+
let mut sums = vec![];
78
let mut sorted = nums.clone();
89
sorted.sort();
9-
let mut sums = vec![];
10+
1011
for i in 0..sorted.len() {
11-
let mut j = i + 1;
12-
let mut k = sorted.len() - 1;
13-
while j < k {
14-
let group = vec![sorted[i], sorted[j], sorted[k]];
15-
match group.iter().sum::<i32>() {
16-
s if s < 0 => j += 1,
17-
s if s > 0 => k -= 1,
18-
_ => {
19-
sums.push(group);
20-
break;
21-
}
12+
let n = sorted[i];
13+
if i > 0 && sorted[i - 1] == n {
14+
continue;
15+
}
16+
if n > 0 {
17+
break;
18+
}
19+
let (mut low, mut high) = (i + 1, sorted.len() - 1);
20+
while low < high {
21+
let group = vec![n, sorted[low], sorted[high]];
22+
let s: i32 = group.iter().sum();
23+
if s < 0 {
24+
low += 1;
25+
continue;
26+
} else if s > 0 {
27+
high -= 1;
28+
continue;
29+
}
30+
sums.push(group);
31+
while low < high && sorted[low] == sorted[low + 1] {
32+
low += 1;
33+
}
34+
while low < high && sorted[high] == sorted[high - 1] {
35+
high -= 1;
2236
}
37+
low += 1;
38+
high -= 1;
2339
}
2440
}
41+
2542
sums
2643
}
2744
}
2845

2946
#[cfg(test)]
3047
mod tests {
3148
use super::*;
49+
use std::collections::HashSet;
3250

3351
#[test]
34-
fn test_example() {
52+
fn test_example1() {
3553
let given = vec![-1, 0, 1, 2, -1, -4];
36-
let mut expected: Vec<Vec<i32>> = vec![vec![-1, 0, 1], vec![-1, -1, 2]];
37-
let mut got = Solution::three_sum(given);
38-
expected.sort();
39-
got.sort();
40-
assert_eq!(got, expected);
54+
let expected: Vec<Vec<i32>> = vec![vec![-1, 0, 1], vec![-1, -1, 2]];
55+
let got = Solution::three_sum(given);
56+
assert_eq!(
57+
got.iter().cloned().collect::<HashSet<Vec<i32>>>(),
58+
expected.iter().cloned().collect::<HashSet<Vec<i32>>>(),
59+
);
60+
}
61+
62+
#[test]
63+
fn test_example2() {
64+
let given = vec![-2, 0, 1, 1, 2];
65+
let expected: Vec<Vec<i32>> = vec![vec![-2, 0, 2], vec![-2, 1, 1]];
66+
let got = Solution::three_sum(given);
67+
assert_eq!(
68+
got.iter().cloned().collect::<HashSet<Vec<i32>>>(),
69+
expected.iter().cloned().collect::<HashSet<Vec<i32>>>(),
70+
);
71+
}
72+
73+
#[test]
74+
fn test_example3() {
75+
let given = vec![0, 0, 0];
76+
let expected: Vec<Vec<i32>> = vec![vec![0, 0, 0]];
77+
let got = Solution::three_sum(given);
78+
assert_eq!(
79+
got.iter().cloned().collect::<HashSet<Vec<i32>>>(),
80+
expected.iter().cloned().collect::<HashSet<Vec<i32>>>(),
81+
);
4182
}
4283
}

0 commit comments

Comments
 (0)
Please sign in to comment.