Leetcode 78. Subsets

本文详细解析了如何通过二进制思想生成集合的所有子集,包括空集和全集。通过对元素存在与否的选择,利用二进制数每一位的0或1来决定元素是否加入子集,从而生成所有可能的子集组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:假如集合为{a, b, c},其子集为[], {c}, {b}, {a}, {b, c}, {a, c}, {a, b}, {a, b, c},一共有8个子集。这里可以看做是排列组合的问题,每个元素在子集中有两种选择,出现或者不出现,那么 3个元素,则有2^3种可能,所以有8个子集(这里已经包含空集了)。

运用上述求子集数量的思想,子集一共有2^3种可能性,(从000-> 111,也就是0-> 7抓换为二进制)

[]: 000 (a  b c 三个元素一个都不取)

{c}:001 (a,b 不取,就选c这个元素)

{b}:010 (a,c不取,就选b这个元素)

{a}:100(b c不取,就选a这个元素)

{b, c}:011(a不取,就选bc这两个元素)

{a, c}:101(b不取,就选ac这两个元素)

{a, b}:110(c不取,就选ab这两个元素)

{a, b, c}: 111(abc三个元素都取)

综上:将十进制转换为二进制,并根据每位上是0还是1来判断是否取对应的元素。

class Solution(object):
    def subsets(self, nums):
        """
        :type nums: List[int]
        :rtype: List[List[int]]
        """
        if not nums:
            return []
        result = []
        for i in range(2**len(nums)):  # 取值是在0~2**n-1
            bin_str = (bin(i)[2:]).rjust(len(nums), '0')  # 十进制转化为n位的二进制数
            tmp_result = []
            for j in range(len(bin_str)):
                if bin_str[j] == '1':  # choose
                    tmp_result.append(nums[j])
            result.append(tmp_result)
        return result

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值