链接:
题目:
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
我的解法: 对于每一个数,都是把所有当前集合append这个数,再append之前的所有集合。比如刚开始是[],来了一个1,[],[1] -> [],[1],[2],[1,2] -> [],[1],[2],[1,2],[3],[1.3],[2,3],[1,2,3]
class Solution(object):
def subsets(self, nums):
all_subsets = [[]]
if nums:
for num in nums:
for idx in range(len(all_subsets)):
all_subsets.append(all_subsets[idx]+[num])
return all_subsets
我的解法2: 比如[1,2,3],有2^3个子集,0-7的所有二进制表示比方5是101,则此时表示子集是[1,3]。两种解法用时相等。
算法思路如下:
对elem_num个数循环,i=0时,就把所有的j向右移0位,则0-7中二进制表示最后一位是1的要append num[0],比如1,3,5,7. 相当于知道了有3个数,8个子集,循环看第i个数要不要加进第j个子集,如果满足(j >> i) & 1,就加
class Solution(object):
def subsets(self, nums):
elem_num = len(nums)
# 子集个数
subset_num = pow(2, elem_num)
subset_set = [[] for i in range(subset_num)]
for i in range(elem_num):
for j in range(subset_num):
# j的二进制数右移i位,如果末位数是1,则应该append
if (j >> i) & 1:
#print "i,j,j >> i", i,j,j >> i
subset_set[j].append(nums[i])
return subset_set
补充python位运算:5 -> 101 -> 5>>2 = 1
a = 0011 1100
b = 0000 1101
-----------------
a&b = 0000 1100
a|b = 0011 1101
a^b = 0011 0001
~a = 1100 0011