Description

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

Example:

Input:

[1,1,2]

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 全排列之二​