Skip to content

Commit e03916e

Browse files
authored
Merge pull request #3 from jtr109/refine-3-sum
Refine 3 sum
2 parents ab07029 + fe9b6e7 commit e03916e

File tree

2 files changed

+17
-102
lines changed

2 files changed

+17
-102
lines changed

.vscode/launch.json

-46
This file was deleted.

three_sum/src/lib.rs

+17-56
Original file line numberDiff line numberDiff line change
@@ -1,67 +1,28 @@
11
#![allow(dead_code)]
22

3-
use std::collections::HashMap;
4-
53
struct Solution {}
64

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;
4721
}
48-
} else {
49-
continue 'second_loop;
5022
}
5123
}
5224
}
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
6526
}
6627
}
6728

0 commit comments

Comments
 (0)