与上题不同的是,这次全排列中有相同的数字出现。
解决方式要基于对DFS的理解(类似于一颗树)
其实就是在树的某一层选择右边的节点时,若该节点与“在这一层时,上一次的选择”相同,则跳过。
即在同一个层次时,不选重复的值。
class Solution {
public:
vector<vector<int>> Ans;
vector<int> vis;
void dfs(vector<int> nums,vector<int> ans,int i){
int j;
if(i == nums.size()){
Ans.push_back(ans);
return ;
}
int lastselect;
bool flag = false;
for(j = 0; j < nums.size(); j++){
if(vis[j] == 1 || (flag && nums[j] == lastselect) )
continue;
vis[j] = 1;
flag = true;
lastselect = nums[j];
ans.push_back(nums[j]);
dfs(nums,ans, i + 1);
vis[j] = 0;
ans.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<int> ans;
vis = nums;
for(int i = 0; i < vis.size(); i++)
vis[i] = 0;
sort(nums.begin(), nums.end());
dfs(nums, ans, 0);
return Ans;
}
};