题目描述:
可与二进制数对应起来。1表示subset中有某位置的元素。对有n个元素的nums,共有0~111...11(n个1)即 2**n个subsets。Given a set of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums =[1,2,3]
, a solution is:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
观察这2**n个二进制数,都是先出现0后出现1,并且数个0和数个1交替出现。以n=3为例:
000
001
010
011
100
101
110
111
左边最高位的周期为2**n即为2**3 = 8,对第j行,当j % 2^n >= 2^(n-1)时,相应为的元素为1。可将各行每个位置对应的周期存到数组里生成相应的2^n个subsets
class Solution(object):
def subsets(self, nums):
ans = []
mark = [2]
for i in range(1,len(nums)):
mark.append(2*mark[i-1])#按照二进制降序的规律写的
n = mark[len(nums)-1]
for i in range(0,n):
tmp = []
for j in range(0,len(nums)):
if i % mark[j] >= mark[j]/2:
tmp.append(nums[j])
ans.append(tmp)
return ans