@@ -4,39 +4,80 @@ struct Solution {}
4
4
5
5
impl Solution {
6
6
pub fn three_sum ( nums : Vec < i32 > ) -> Vec < Vec < i32 > > {
7
+ let mut sums = vec ! [ ] ;
7
8
let mut sorted = nums. clone ( ) ;
8
9
sorted. sort ( ) ;
9
- let mut sums = vec ! [ ] ;
10
+
10
11
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 ;
22
36
}
37
+ low += 1 ;
38
+ high -= 1 ;
23
39
}
24
40
}
41
+
25
42
sums
26
43
}
27
44
}
28
45
29
46
#[ cfg( test) ]
30
47
mod tests {
31
48
use super :: * ;
49
+ use std:: collections:: HashSet ;
32
50
33
51
#[ test]
34
- fn test_example ( ) {
52
+ fn test_example1 ( ) {
35
53
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
+ ) ;
41
82
}
42
83
}
0 commit comments