Skip to content

80 子集II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

题解

这题和78子集类似,唯一区别是有重复元素,我们在组合总和II中详细解释过怎么去掉重复的选择(就是不能选择递归树上同层的相同的元素)。 判断的标准是 i>0 && nums[i] === nums[i-1] && used[i-1] === false

javascript
var subsetsWithDup = function (nums) {
    var finalResult = []
    var subsetsWithDupInner = function (nums, index, results, used) {
        finalResult.push(results)
        if (index === nums.length) {
            return
        }
        for (let i = index; i < nums.length; i++) {
            if (i > 0 && nums[i] === nums[i - 1] && used[i - 1] === false) {
                continue;
            }
            
            used[i] = true
            subsetsWithDupInner(nums, i + 1, [...results, nums[i]], used)
            used[i] = false

        }
    }
    //先排序
    nums.sort()
    //定义used数组
    var used = Array(nums.length).fill(false)

    subsetsWithDupInner(nums, 0, [], used)

    return finalResult
};

上次更新于: