版权声明: https://blog.csdn.net/Dorothy_Xue/article/details/83861632
题目描述:
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [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.
遇上提不一样的是多了一步去重。
本题中没有对初始数字序列排序,而在去重时,为了查看相邻的同样的数字是不是在上一步中用过(因为如果用过,会造成重复),所以需要先排序。