Permutations II 全排列
给定一个有重复数字的序列,返回其所有可能的全排列。
输入:
[1,2,1]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
方法一:回溯
在46题的基础上增加去重即可
1.排序sort(nums.begin(),nums.end());
2.去重if(i>0&&nums[i]==nums[i-1]&&visited[i-1]==1) continue;
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>>res;
vector<int>out,visited(nums.size(),0);
sort(nums.begin(),nums.end());
bfs(out,0,nums,visited,res);
return res;
}
void bfs(vector<int>& out,int level,vector<int>& nums,vector<int>& visited,vector<vector<int>>& res){
if(level==nums.size()) {
res.push_back(out);return;
}
for(int i=0;i<nums.size();i++){
if(visited[i]==1) continue;
if(i>0&&nums[i]==nums[i-1]&&visited[i-1]==1) continue;
visited[i]=1;
out.push_back(nums[i]);
bfs(out,level+1,nums,visited,res);
out.pop_back();//完成一次递归之后清零
visited[i]=0;//完成一次递归之后清零
}
}
};