堅持天天一道題,刷題學習Rust.git
全排列 II
給定一個可包含重複數字的序列,返回全部不重複的全排列。github
示例:app
輸入: [1,1,2]
輸出:
[
[1,1,2],
[1,2,1],
[2,1,1]]函數
思路:學習
由於要窮舉結果,因此只能用窮舉的辦法.
思路:
對於徹底不重複的數字,找到全部可能組合的辦法:
[1]
對於1,2
則是
[2,1]
[1,2]
於1,2,3
則是
[3,2,1] [2,3,1],[2,1,3] 遍歷前一個,在全部可能的位置插入新來的數字便可.
[3,1,2] [1,3,2] [1,2,3]code
這種方式的壞處是要不停地移動,插入,leetcode
從頭開始的方法:
首先選定最開始的位置,還以[1,2,3]舉例,那麼
一開始是:
1 [2,3]組合
2 [1,3]組合
3 [1,2]組合
若是碰到重複的數字直接跳過進行下一個.
這樣一輪下來之後[1,2,3]變成了[3,1,2],須要修復一下.get
struct Solution {} impl Solution { pub fn permute_unique(nums: Vec<i32>) -> Vec<Vec<i32>> { if nums.len() == 0 { return Vec::new(); } let mut nums = nums; nums.sort(); let nl = nums.len(); return Solution::permute_interna(&mut nums[0..nl], nl); } fn permute_interna(nums: &mut [i32], n: usize) -> Vec<Vec<i32>> { if nums.len() == 1 { let mut v = vec![0; n]; v[n - 1] = nums[0]; let mut vs = Vec::new(); vs.push(v); return vs; } let mut vs2 = Vec::new(); let nl = nums.len(); // println!("enter={:?}", nums); // let mut nums2 = Vec::new(); // for i in 0..nl { // nums2.push(nums[i]); // } for i in 0..nums.len() { if i > 0 && nums[i] == nums[0] { continue; //重複的數字 } let t = nums[i]; nums[i] = nums[0]; nums[0] = t; let mut vs = Solution::permute_interna(&mut nums[1..nl], n); for v in &mut vs { v[n - nums.len()] = nums[0]; //把剛剛選定的隊首放進去 } vs2.append(&mut vs) } //nums裏面的順序回覆一下 let t = nums[0]; for i in 1..nl { nums[i - 1] = nums[i]; //有沒有現成的函數能夠使用呢? } nums[nl - 1] = t; // println!("exit={:?}", nums); // assert_eq!(nums, &mut nums2[0..nl]); vs2 } } mod test { use super::*; #[test] fn test_permute() { println!("v={:?}", Solution::permute_unique(vec![2, 2, 1, 1])) } }
歡迎關注個人github,本項目文章全部代碼均可以找到.it