这道题与上一道全排列题目的区别是序列中有重复数字,并且要返回所有不重复的全排列组合。
思路:
依旧使用回溯算法,要加入判断去重,因为回溯算法是在n个for循环的基础上改进而来,所以下图用三个for循环的方式来说明重复
当回到最外层循环的时候,i 指向1,再向内深入就会造成(1, 1, 2)重复,且此时i > 0 && nums[i] == nums[i - 1] && !used[i - 1],即为判断条件
代码:
void backtrack(vector<vector<int>> &res, vector<int>& temp, vector<bool>& used, vector<int>& nums, int dep){
if(dep == nums.size()){
res.push_back(temp);
return;
}
for(int i = 0; i < nums.size(); i++){
if(!used[i]){
if(i > 0 && nums[i] == nums[i - 1] && !used[i - 1])
continue;
temp[dep] = nums[i];
used[i]=true;
backtrack(res, temp, used, nums, dep+1);
used[i]=false;
}
}
}
vector<vector<int>> permute(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<bool> used(nums.size(),false); //记录nums该为是否被使用
vector<int> temp(nums.size()); //储存一行
vector<vector<int>> res = {};
backtrack(res, temp, used, nums, 0);
return res;
}