[leetcode] 47. Permutations II
原创
©著作权归作者所有:来自51CTO博客作者是念的原创作品,请联系作者获取转载授权,否则将追究法律责任
Description
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Example:
Input:
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
分析一
题目的意思是:返回一个数组的全排列。
- 深度优先遍历的问题,这里注意一下相同数字的处理。
- 特异全排列,候选为-9~9,19个数字
使用array[19]记录着19个数字在序列中出现的次数
条件 : array 中记录 i, array[i]>0 ,即原始序列中的这个字母还没有被用完
代码一
class Solution {
private:
int array[19]={0};
void permutations(vector<vector<int> > &result,vector<int> &num,int start,int n){
if(start==n){
result.push_back(num);
}else{
for(int i=0;i<19;i++){
if(array[i]>0){
array[i]--;
num[start]=i-9;
permutations(result,num,start+1,n);
array[i]++;
}
}
}
}
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
for(int i=0;i<num.size();i++){
array[num[i]+9]++;
}
vector<vector<int> > result;
permutations(result,num,0,num.size());
return result;
}
};
分析二
- 深度优先搜索,跟上面的解法一样。
- 去重的方法不一样,这里中规中矩利用set来去重的方法。
代码二
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
set<vector<int>> res;
permute(nums,res,0);
return vector<vector<int>> (res.begin(),res.end());
}
void permute(vector<int>& nums,set<vector<int>>& res,int start){
if(start>=nums.size()){
res.insert(nums);
}
for(int i=start;i<nums.size();i++){
if(i!=start&&nums[i]==nums[start]) continue;
swap(nums[start],nums[i]);
permute(nums,res,start+1);
swap(nums[start],nums[i]);
}
}
};
参考文献
[编程题]permutations-ii[LeetCode] Permutations II 全排列之二