给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
这题看完后是头痛的,还是用dfs算法比较好解,首先把这道题理解成给你一些数字,让你用这些数字进行填空,最后把所有填得的数列存起来返回。
难点:这些数字是具有重复性质的因此,需要一个数组来纪录某个数字及其重复数字是否填入,如果填入就跳过,否则继续。
vector<int> vis;
vis.resize(nums.size());
if(vis[i]||i>0&&vis[i] == vis[i-1]&&!vis[i-1]){
continue;
}
dfs的参数有四个,传入的数组,返回的数组,开始位置,判断重复的数组。
class Solution {
public:
vector<int> vis;
void dfs(vector<int>& nums,vector<vector<int>>&ans,int idx,vector<int>& perm){
if(idx == nums.size()){
ans.push_back(perm);
return;
}
else{
for(int i=0;i<nums.size();i++){
if(vis[i] || i>0&& nums[i]==nums[i-1]&&!vis[i-1]){
continue;
}
perm.push_back(nums[i]);
vis[i] =1;
dfs(nums,ans,idx+1,perm);
vis[i] =0;
perm.pop_back();
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
//dfs
vector<vector<int>> ans;
vector<int> perm;
vis.resize(nums.size());
sort(nums.begin(),nums.end());
dfs(nums,ans,0,perm);
return ans;
}
};
最后U2FsdGVkX18sLCYrZyAxPHNjLj6XK/0c0no0qHpaggUo1ihq+kJmOTqolhsxCouw