From a0cdf867da023889c53d209328ba66ee3725c8b0 Mon Sep 17 00:00:00 2001 From: jtr109 Date: Wed, 29 Jul 2020 20:07:09 +0800 Subject: [PATCH 1/2] ignore vscode config --- .vscode/launch.json | 46 --------------------------------------------- 1 file changed, 46 deletions(-) delete mode 100644 .vscode/launch.json diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 7554378..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'reverse_integer'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=reverse_integer" - ], - "filter": { - "name": "reverse_integer", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - }, - { - "type": "lldb", - "request": "launch", - "name": "Debug unit tests in library 'three_sum'", - "cargo": { - "args": [ - "test", - "--no-run", - "--lib", - "--package=three_sum" - ], - "filter": { - "name": "three_sum", - "kind": "lib" - } - }, - "args": [], - "cwd": "${workspaceFolder}" - } - ] -} From fe9b6e761e860e062baafbdec23a1090c61de1f4 Mon Sep 17 00:00:00 2001 From: jtr109 Date: Wed, 29 Jul 2020 20:08:35 +0800 Subject: [PATCH 2/2] refine 3 sum by setting 2 anchors on ends of the array --- three_sum/src/lib.rs | 73 +++++++++++--------------------------------- 1 file changed, 17 insertions(+), 56 deletions(-) diff --git a/three_sum/src/lib.rs b/three_sum/src/lib.rs index 9bd3b8a..d3247bf 100644 --- a/three_sum/src/lib.rs +++ b/three_sum/src/lib.rs @@ -1,67 +1,28 @@ #![allow(dead_code)] -use std::collections::HashMap; - struct Solution {} -struct Extractor { - nums: Vec, - nums_map: HashMap, - sums_map: HashMap, ()>, -} - -impl Extractor { - fn new(nums: &Vec) -> Self { - let mut sorted_nums = nums.clone(); - sorted_nums.sort(); - let mut nums_map = HashMap::new(); - for &n in nums.iter() { - let count = nums_map.entry(n).or_insert(0); - *count += 1; - } - Extractor { - nums: sorted_nums, - nums_map, - sums_map: HashMap::new(), - } - } - - fn get_expected(&self, n: &i32, m: &i32) -> Option { - let exp = 0 - n - m; - let count = self.nums_map.get(&exp).unwrap_or(&0); - if vec![*n, *m, exp].iter().filter(|&x| *x == exp).count() > *count { - return None; - } - Some(exp) - } - - fn build_sums_map(&mut self) { - for (i, n) in self.nums.iter().enumerate() { - 'second_loop: for m in self.nums[i + 1..].iter() { - if let Some(exp) = self.get_expected(n, m) { - if exp < *m { - // wrong sort - break 'second_loop; - } else { - self.sums_map.insert(vec![*n, *m, exp], ()); +impl Solution { + pub fn three_sum(nums: Vec) -> Vec> { + let mut sorted = nums.clone(); + sorted.sort(); + let mut sums = vec![]; + for i in 0..sorted.len() { + let mut j = i + 1; + let mut k = sorted.len() - 1; + while j < k { + let group = vec![sorted[i], sorted[j], sorted[k]]; + match group.iter().sum::() { + s if s < 0 => j += 1, + s if s > 0 => k -= 1, + _ => { + sums.push(group); + break; } - } else { - continue 'second_loop; } } } - } - - fn three_sum(&mut self) -> Vec> { - self.build_sums_map(); - self.sums_map.keys().cloned().collect() - } -} - -impl Solution { - pub fn three_sum(nums: Vec) -> Vec> { - let mut ext = Extractor::new(&nums); - ext.three_sum() + sums } }