- 兄弟题,不带重的全排列 LQ46
- 先排序,然后回溯的时候,只让相同的元素被用一次。
- 即[…A1,A2…]中,先由A1来作为dfs的起点往后跑,那么不希望之后也让A2作为dfs起点跑,这会造成重复。目标就是跳过它们
- 个人觉得code1更好理解
code1
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<bool> used(nums.size(), false);
vector<int> tmp;
sort(nums.begin(), nums.end());
dfs(nums, used, tmp);
return res;
}
private:
vector<vector<int>> res;
void dfs(vector<int> &nums, vector<bool> &used, vector<int> tmp ){
if(tmp.size()==nums.size()){
res.push_back(tmp);
return ;
}
for(int i=0; i<nums.size(); i++){
if(used[i]) continue;
used[i]=true;
tmp.push_back(nums[i]);
dfs(nums, used, tmp);
used[i]=false;
tmp.pop_back();
while(i<nums.size()-1 && nums[i]==nums[i+1]) i++;
}
}
};
code2
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<bool> used(nums.size(), false);
vector<int> tmp;
sort(nums.begin(), nums.end());
dfs(nums, used, tmp);
return res;
}
private:
vector<vector<int>> res;
void dfs(vector<int> &nums, vector<bool> &used, vector<int> tmp ){
if(tmp.size()==nums.size()){
res.push_back(tmp);
return ;
}
for(int i=0; i<nums.size(); i++){
if(used[i]) continue;
if(i>0 && nums[i-1]==nums[i] && !used[i-1]) continue;
used[i]=true;
tmp.push_back(nums[i]);
dfs(nums, used, tmp);
used[i]=false;
tmp.pop_back();
}
}
};