比如需要全排列的数组中存在重复元素,首先我们将数组排序将重复的元素放在一起,然后在递归的时候判断当前元素是否和其前一个元素值相等,如果相等,则判断前一个元素是否已经在dfs序列中(被使用过),如果前一个元素还没被使用过,则当前元素也无法被使用。
因此这里的逻辑为:(nums[i-1]==nums[i] && !hm[i-1])
class Solution {
public:
vector<bool> st; //这个数是否被用过
vector<int> path;
vector<vector<int>> res;
void sdfs(int u,vector<int>& nums){
if(u == nums.size()){
res.push_back(path);
return;
}
for(int i = 0; i < nums.size();++i){
if(!st[i]){
if(i && nums[i-1] == nums[i] && !st[i-1]) continue;
st[i] = true;
path.push_back(nums[i]);
sdfs(u+1,nums);
path.pop_back();
st[i] = false;
}
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
int n = nums.size();
st = vector<bool>(n,false);
sort(nums.begin(),nums.end());
sdfs(0,nums);
return res;
}
};