去重逻辑是
pop_back之后第一个1就用删除了,然后遍历第二个1,因为第二个1的搜索情况和第一个1完全一致,所以nums[i]==nums[i-1]并且由于第一个1访问完之后是False,加上第二个1尚未访问因此isVisit都是False,因此有isVisit[i-1]==0&&isVisit[i]==0
if(i>=1&&nums[i]==nums[i-1]&&isVisit[i-1]==0&&isVisit[i]==0){
continue;
}
class Solution {
public:
vector<bool> isVisit;
vector<int> path;
vector<vector<int>> paths;
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
isVisit=vector<bool>(nums.size()+10,0);
dfs(nums);
return paths;
}
void dfs(vector<int>& nums){
if(path.size()==nums.size()){
paths.push_back(path);
return ;
}
for(int i=0;i<nums.size();++i){
if(isVisit[i]){
continue;
}
if(i>=1&&nums[i]==nums[i-1]&&isVisit[i-1]==0&&isVisit[i]==0){
continue;
}
isVisit[i]=1;
path.push_back(nums[i]);
dfs(nums);
path.pop_back();
isVisit[i]=0;
}
}
};