|
1 | 1 | #![allow(dead_code)]
|
2 | 2 |
|
3 |
| -use std::collections::HashMap; |
4 |
| - |
5 | 3 | struct Solution {}
|
6 | 4 |
|
7 |
| -struct Extractor { |
8 |
| - nums: Vec<i32>, |
9 |
| - nums_map: HashMap<i32, usize>, |
10 |
| - sums_map: HashMap<Vec<i32>, ()>, |
11 |
| -} |
12 |
| - |
13 |
| -impl Extractor { |
14 |
| - fn new(nums: &Vec<i32>) -> Self { |
15 |
| - let mut sorted_nums = nums.clone(); |
16 |
| - sorted_nums.sort(); |
17 |
| - let mut nums_map = HashMap::new(); |
18 |
| - for &n in nums.iter() { |
19 |
| - let count = nums_map.entry(n).or_insert(0); |
20 |
| - *count += 1; |
21 |
| - } |
22 |
| - Extractor { |
23 |
| - nums: sorted_nums, |
24 |
| - nums_map, |
25 |
| - sums_map: HashMap::new(), |
26 |
| - } |
27 |
| - } |
28 |
| - |
29 |
| - fn get_expected(&self, n: &i32, m: &i32) -> Option<i32> { |
30 |
| - let exp = 0 - n - m; |
31 |
| - let count = self.nums_map.get(&exp).unwrap_or(&0); |
32 |
| - if vec![*n, *m, exp].iter().filter(|&x| *x == exp).count() > *count { |
33 |
| - return None; |
34 |
| - } |
35 |
| - Some(exp) |
36 |
| - } |
37 |
| - |
38 |
| - fn build_sums_map(&mut self) { |
39 |
| - for (i, n) in self.nums.iter().enumerate() { |
40 |
| - 'second_loop: for m in self.nums[i + 1..].iter() { |
41 |
| - if let Some(exp) = self.get_expected(n, m) { |
42 |
| - if exp < *m { |
43 |
| - // wrong sort |
44 |
| - break 'second_loop; |
45 |
| - } else { |
46 |
| - self.sums_map.insert(vec![*n, *m, exp], ()); |
| 5 | +impl Solution { |
| 6 | + pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> { |
| 7 | + let mut sorted = nums.clone(); |
| 8 | + sorted.sort(); |
| 9 | + let mut sums = vec![]; |
| 10 | + 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; |
47 | 21 | }
|
48 |
| - } else { |
49 |
| - continue 'second_loop; |
50 | 22 | }
|
51 | 23 | }
|
52 | 24 | }
|
53 |
| - } |
54 |
| - |
55 |
| - fn three_sum(&mut self) -> Vec<Vec<i32>> { |
56 |
| - self.build_sums_map(); |
57 |
| - self.sums_map.keys().cloned().collect() |
58 |
| - } |
59 |
| -} |
60 |
| - |
61 |
| -impl Solution { |
62 |
| - pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> { |
63 |
| - let mut ext = Extractor::new(&nums); |
64 |
| - ext.three_sum() |
| 25 | + sums |
65 | 26 | }
|
66 | 27 | }
|
67 | 28 |
|
|
0 commit comments