diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 3e0f082..1d4aa4d 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -472,3 +472,5 @@ mod p680_valid_palindrome_ii; mod p922_sort_array_by_parity_ii; mod p90_subsets_ii; + +mod p47_permutations_ii; diff --git a/src/problem/p47_permutations_ii.rs b/src/problem/p47_permutations_ii.rs new file mode 100644 index 0000000..6473c70 --- /dev/null +++ b/src/problem/p47_permutations_ii.rs @@ -0,0 +1,62 @@ +/** + * [47] Permutations II + */ +pub struct Solution {} + +// submission codes start here + +impl Solution { + pub fn permute_unique(mut nums: Vec) -> Vec> { + nums.sort_unstable(); + + let mut result = vec![]; + let mut visited = vec![false; nums.len()]; + let mut path = Vec::with_capacity(nums.len()); + + Self::search(&nums, 0, &mut path, &mut visited, &mut result); + + result + } + + fn search( + nums: &Vec, + pos: usize, + path: &mut Vec, + visited: &mut Vec, + result: &mut Vec>, + ) { + if pos == nums.len() { + result.push(path.clone()); + return; + } + + for i in 0..nums.len() { + if visited[i] || (i > 0 && nums[i - 1] == nums[i] && !visited[i - 1]) { + continue; + } + + visited[i] = true; + + path.push(nums[i]); + Self::search(nums, pos + 1, path, visited, result); + path.pop(); + + visited[i] = false; + } + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_47() { + assert_eq!( + vec![vec![1, 1, 2], vec![1, 2, 1], vec![2, 1, 1]], + Solution::permute_unique(vec![1, 1, 2]) + ); + } +}