力扣:90. 子集 II(Python3)

题目:

给你一个整数数组 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

你可能感兴趣的:(LeetCode,leetcode,python,算法)