leetcode題庫——全排列II
阿新 • • 發佈:2018-11-11
題目描述:
給定一個可包含重複數字的序列,返回所有不重複的全排列。
示例:
輸入: [1,1,2] 輸出: [ [1,1,2], [1,2,1], [2,1,1] ]
方法:
class Solution { public: vector<vector<int>> res; vector<int> flag; int length; vector<vector<int>> permuteUnique(vector<int>& nums) { if(nums.size()==0) return res; length=nums.size(); int a[length]={0}; sort(nums.begin(),nums.end()); dfs(a,nums,0); return res; } void dfs(int a[],vector<int>& nums,int deep){ for(int i=0;i<length;i++){ if(i>0&&nums[i]==nums[i-1]&&a[i-1]==1) continue; if(a[i]==0){ flag.push_back(nums[i]); a[i]=1; dfs(a,nums,deep+1); flag.pop_back(); a[i]=0; } } if(deep==length) res.push_back(flag); } };
思路:
為字元序列每個數字設定一個標籤,記錄其是否被記錄到flag中,若已記錄到flag中,則設a[i]為1,否則為0.
遇上提不一樣的是多了一步去重。
本題中沒有對初始數字序列排序,而在去重時,為了檢視相鄰的同樣的數字是不是在上一步中用過(因為如果用過,會造成重複),所以需要先排序。