题目:
给你一个整数数组
nums
,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
来源:力扣(LeetCode)
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
示例:
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
示例 2:输入:nums = [0]
输出:[[],[0]]
解法:
首先在结果中加入空集,接着从1遍历到len(nums),每次使用组合数C(n,k),从nums中选取k个数,k就是迭代的轮数。然后,由于存在相同的数,并且因为子集是无序的,所以选出来的组合会出现重复,所以将组合内部排序,保证有序,然后去重,就可以添加到结果中了。
代码:
from itertools import combinations class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: result = [[]] for index in range(1, len(nums) + 1): for combination in set(map(lambda x: tuple(sorted(x)), combinations(nums, index))): result.append(list(combination)) return result