要求:会有重复数字的数组全排列,去重
思路:每轮不加同样的数就行了,lastnum记录,提前排序。可以用一个count代替visited表示数组中每个数有多少个,放一个个数减一,也可以用visited记录位置i是否被访问而非nums[i],用count思路清晰点
class Solution {
public:
vector<vector<int>> v;
unordered_map<int,int> count;
vector<int> tmp;
void dfs(vector<int>& nums){
if(tmp.size()==nums.size()){
v.push_back(tmp);
return;
}
int lastnum=-11;
for(int i=0;i<nums.size();++i){
if(lastnum!=nums[i]&&count[nums[i]]!=0){
lastnum=nums[i];
--count[nums[i]];
tmp.push_back(nums[i]);
dfs(nums);
++count[nums[i]];
tmp.pop_back();
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i=0;i<nums.size();++i)
count[nums[i]]+=1;
dfs(nums);
return v;
}
};