思路:假如集合为{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