给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
第一种思路:
回溯解决,对于每个数字考虑放它或者不放它。
class Solution(object):
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
res, tmp = [], []
def generate(nums, n):
res.append(tmp[:])
if n == len(nums):
return
for i in range(n, len(nums)):
tmp.append(nums[i])
n += 1
generate(nums, n)
tmp.pop()
generate(nums, 0)
return res
===================================
class Solution(object):
def generate(self, i, nums, item, result):
if (i >= len(nums)):
return
item.append(nums[i])
result.append(item[:])
self.generate( i+1, nums, item, result)
item.pop()
self.generate( i+1, nums, item, result)
def subsets(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
if len(nums) <= 0:
return [[]]
l = len(nums)
result = [[]]
self.generate(0, nums, list(), result)
return result
第二种思路:
线性扫描,读取k+1个数时,把前k个数的所有子集都新加入一个第k+1个数,形成含有这个k+1的所有子集,再把它们放入result。
比如对于nums = [1, 2, 3]:
第一轮,已知subsets只有空集[], 把第一个元素1放进去,得到 subsets = [[], [1]]
第二轮,把3放进已知的两个子集,得到 subsets = [[], [1], [3], [1,3]]
以此类推
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = [[]]
for num in nums:
new_res = []
for subset in res:
new_res.append(subset + [num])
res += new_res
return res