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
};