Python|每日一练|整数数组|非重复子集(幂集)|递归:子集 II

题目:

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

幂集是一个集合中所有的子集构成的集合。例如,如果�={1,2,3}A={1,2,3},则�A的幂集P(A)=\{\varnothing,\{1\},\{2\},\{3\},\{1,2},\{1,3\},\{2,3\},\{1,2,3\}\}。其中∅∅表示空集,{1}{1}表示只含一个元素1的子集,{2\}表示只含一个元素2的子集,以此类推。

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

Tips:解集 

解集是一个数学用语,指以一个方程(组)或不等式(组)的所有解为元素的集合叫做该方程(组)或不等式(组)的解集。表示解的集合的方法有三种:列举法、描述法和图示法。

示例 1

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

示例 2

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

请在以下选项中选择

A、选项,错误:
执行结果:[[], [1], [2], [1, 2], [2], [1, 2], [2, 2], [1, 2, 2]] 有重复子集

class Solution(object):
    def subsetsWithDup(self, nums):
        nums.sort()
        res = [[]]
        begin = 0
        for index in range(len(nums)):
            if index > 0 or nums[index] != nums[index - 1]:
                begin = 0
            size = len(res)
            for j in range(begin, size):
                curr = list(res[j])
                curr.append(nums[index])
                res.append(curr)
            begin = size
        return res

B、选项,错误:
执行结果:[[], [1], [2], [1, 2], [2], [1, 2], [2, 2], [1, 2, 2]] 有重复子集

class Solution(object):
    def subsetsWithDup(self, nums):
        nums.sort()
        res = [[]]
        begin = 0
        for index in range(len(nums)):
            if index != 0 or nums[index] != nums[index - 1]:
                begin = 0
            size = len(res)
            for j in range(begin, size):
                curr = list(res[j])
                curr.append(nums[index])
                res.append(curr)
            begin = size
        return res

C、选项,正确;
执行结果:[[], [1], [2], [1, 2], [2, 2], [1, 2, 2]]

class Solution(object):
    def subsetsWithDup(self, nums):
        nums.sort() #或者nums=sorted(nums)
        res = [[]]
        begin = 0
        for index in range(len(nums)):
            if index == 0 or nums[index] != nums[index - 1]:
                begin = 0
            size = len(res)
            for j in range(begin, size):
                curr = list(res[j])
                curr.append(nums[index])
                res.append(curr)
            begin = size
        return res

D、选项,错误;
执行结果:[[], [1], [2], [1, 2], [2, 2], [1, 2, 2]] 子集不全

class Solution(object):
    def subsetsWithDup(self, nums):
        nums.sort()
        res = [[]]
        begin = 0
        for index in range(len(nums)):
            if index == 0 and nums[index] != nums[index - 1]:
                begin = 0
            size = len(res)
            for j in range(begin, size):
                curr = list(res[j])
                curr.append(nums[index])
                res.append(curr)
            begin = size
        return res

代码分析:

对于给定的整数数组nums,求它的所有子集(幂集)的问题,可以使用递归的方法来解决。

首先,我们考虑数组nums的长度为0的情况。在这种情况下,数组nums的所有子集都是空集,所以我们可以直接返回空集。

接下来,我们考虑数组nums的长度为1的情况。在这种情况下,数组nums的所有子集包括空集和数组nums本身,即[], [nums[0]]。

最后,我们考虑数组nums的长度大于1的情况。在这种情况下,我们可以将数组nums分成两部分,分别为nums[0:len(nums)-1]和nums[len(nums)-1]。对于nums[0:len(nums)-1],我们可以递归地求出它的所有子集,然后将nums[len(nums)-1]加入到每一个子集中。这样就可以得到数组nums的所有子集。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

打酱油的工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值