leetcode 第78题 子集 python解法(用时48ms)
问题分析
该问题要求返回数组的所有子集,一个数组子集的个数等于2的数组长度次幂(2^(len(nums))。首先这道题有多种解法:有使用深度优先遍历来做的,还有使用递归法来做,还有一种解法是使用位运算来计算。比如,数组[1,2,3]的长度为3,那么子集的个数就等于8,而从0到7如果分别用二进制表示就是000,001,010,011,100,101,110,111这8个。我们可以将二进制字符串与原数组对应(长度都等于3)。当二进制某位上的数组为0时,就不去取原数组上对应的数,如果等于1,就将数组的数取出放新的数组中。比如说101,我们就可以取对应数组上第一和第二位的数组成新数组[1,3]。而000,就说明一个数都不取,即为空数组。这样就可以取到数组的所有子集了。
源码
class Solution:
ret = []
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
length = len(nums)
ret = []
for num in range(2**length):
temp = []
num = '{0:{a}b}'.format(num, a=length)
for index, value in enumerate(num):
if value == '1':
temp.append(nums[index])
ret.append(temp)
return ret