这道题与全排列(力扣46)-CSDN博客 的不同就在于集合中有相同元素,我们唯一多的操作就是在同一层递归中也要去重,其他的都与上一题相同。大家可以结合我下面的代码及详细注释理解此题。
代码及详细注释如下:
class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(vector<int>& nums,vector<int>& used){//终止条件if(path.size() == nums.size()){result.push_back(path);return;}for(int i = 0;i < nums.size();i++){//同层递归去重if(i > 0 && nums[i] == nums[i - 1] && used[i - 1] == 0){continue;}//这个去重保证一个排列中不重复使用元素(注意是不重复使用,并不意味着排列中不出现相同元素,因为集合中本身就有相同元素)if(used[i] == 1) continue;path.push_back(nums[i]);used[i] = 1;backtracking(nums,used);//递归//回溯path.pop_back();used[i] = 0;}return;}vector<vector<int>> permuteUnique(vector<int>& nums) {result.clear();path.clear();sort(nums.begin(), nums.end()); // 排序vector<int> used(nums.size(),0);backtracking(nums,used);return result;}
};