47 全排列2
给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
来源:力扣(LeetCode)
链接:题目链接
题解:先参考leetcode46 全排列递归方法的解决。
先排序, 针对当前数字与上一个数字相同时,且上一个数字未被使用则跳过,因为在上一个数字作为开始时和当前数字排列会重复。
class Solution {
public:
vector<int> as;
vector<vector<int> > ans;
vector<vector<int>> permuteUnique(vector<int>& nums) {
int len=nums.size();
bool sign[len];
memset(sign,false,len);
sort(nums.begin(),nums.end());
generateP(nums,sign,as);
return ans;
}
void generateP(vector<int>& nums,bool sign[],vector<int> as){
for(int i = 0;i < nums.size();i ++){
if(sign[i] || (i>0 && !sign[i-1] && nums[i]==nums[i-1])){
continue;
}
sign[i] = true;//标记为已使用
as.push_back(nums[i]);//放入序列
if(as.size() == nums.size()){//出现解
ans.push_back(as);
}else{//序列长度不够,继续处理
generateP(nums,sign,as);
}
as.pop_back();//从序列中删除
sign[i] = false;//重新标记为未使用
}
}
};