From 355090199ae734b36073858d91436e8aca7fd118 Mon Sep 17 00:00:00 2001 From: jackfiled Date: Wed, 5 Feb 2025 11:24:13 +0800 Subject: [PATCH] 20250205 finished. --- src/problem/mod.rs | 2 ++ src/problem/p90_subsets_ii.rs | 68 +++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 src/problem/p90_subsets_ii.rs diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 79d690d..3e0f082 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -470,3 +470,5 @@ mod p598_range_addition_ii; mod p680_valid_palindrome_ii; mod p922_sort_array_by_parity_ii; + +mod p90_subsets_ii; diff --git a/src/problem/p90_subsets_ii.rs b/src/problem/p90_subsets_ii.rs new file mode 100644 index 0000000..74a012e --- /dev/null +++ b/src/problem/p90_subsets_ii.rs @@ -0,0 +1,68 @@ +/** + * [90] Subsets II + */ +pub struct Solution {} + +// submission codes start here + +impl Solution { + pub fn subsets_with_dup(mut nums: Vec) -> Vec> { + let mut result = Vec::with_capacity(2usize.pow(nums.len() as u32)); + let mut path = Vec::with_capacity(nums.len()); + + nums.sort_unstable(); + Self::search(&nums, &mut path, 0, false, &mut result); + + result + } + + pub fn search( + nums: &Vec, + path: &mut Vec, + pos: usize, + choose: bool, + result: &mut Vec>, + ) { + if pos == nums.len() { + result.push(path.clone()); + return; + } + + // 不选择pos + Self::search(nums, path, pos + 1, false, result); + + // 选择pos + // 如果nums[pos - 1] == nums[pos - 1] 且没有选择前一个数 + // 说明选择重复了 + if !choose && pos > 0 && nums[pos - 1] == nums[pos] { + return; + } else { + path.push(nums[pos]); + Self::search(nums, path, pos + 1, true, result); + path.pop(); + } + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_90() { + assert_eq!( + vec![ + vec![], + vec![2], + vec![2, 2], + vec![1], + vec![1, 2], + vec![1, 2, 2], + ], + Solution::subsets_with_dup(vec![1, 2, 2]) + ); + assert_eq!(vec![vec![], vec![0]], Solution::subsets_with_dup(vec![0])); + } +}