思路:

回溯暴搜。和前一题的区别在于集合中是否有相同的元素。

排序后去重。

储备:

代码随想录

问题重点:

1、相同的数字在同一个位置不能重复使用。所以要跳过
2、没有用used判断的话是这样的情况,因为一会树层去重一会树枝去重就全都跳过了:

 数层去重和树枝去重为何可行,你看一眼这两个图就知道了。

3、关键在于在for循环里的所有操作里加了个if
4、

如果要对树层中前一位去重,就用used[i - 1] == false

如果要对树枝前一位去重用used[i - 1] == true

最后:

class Solution {
public:
    
    vector<vector<int>> res;
    vector<int> path;

    void search(vector<int>& nums, vector<bool>& used) {

        if (nums.size()==path.size()) {
            res.push_back(path);
            return ;
        }

        for (int i=0;i<nums.size();i++) {
            // if (i>0 && nums[i-1]==nums[i] && used[i-1]==true) continue;//如果相同数字在这条路径之前用过了
            if (i>0 && nums[i-1]==nums[i] && used[i-1]==false) continue;//如果相同数字在这层递归之前用过了
            if (used[i]==false) {//如果这一位没用过,才能放进来。排除掉自身
                used[i]=true;
                path.push_back(nums[i]);
                search(nums,used);
                used[i]=false;
                path.pop_back();
            }
        }
        return ;
    }

    vector<vector<int>> permuteUnique(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        vector<bool> used(nums.size(),false);
        search(nums,used);
        return res;
    }
};

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐