幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
一、递归
e.g.{1,2}的子集每个加上3即{1,2,3}的子集
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = [[]]
for i in nums:
l = len(ans)
for j in range(l):
t = []
t.extend(ans[j])
t.append(i)
ans.append(t)
return ans
二、位表示
nums = [1, 2, 3],长度为3,取看成是1,不取看成是0.
那么就有:
[0, 0, 0] -> 0
[0, 0, 1] -> 1
[0, 1, 0] -> 2
[0, 1, 1] -> 3
[1, 0, 0] -> 4
[1, 0, 1] -> 5
[1, 1, 0] -> 6
[1, 1, 1] -> 7
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = []
n = 1<<len(nums)
for i in range(n):
res = []
num = i
idx = 0
while num:
if num & 1:
res.append(nums[idx])
num >>= 1
idx += 1
ans.append(res)
return ans
三、回溯
题目要求:解集不能包含重复的子集
那么剪去图中的部分就能实现不包含重复的子集,如果你不这样做,你后面需要另外对所有的子集进行去重
代码实现:我们直接对取当前元素的后面的元素就能实现剪枝nums[i+1:]
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
if len(nums) == 0:
return [[]]
def back(chose, cur):
res.append(cur)
if not chose:
return
for i in range(len(chose)):
back(chose[i+1:], cur+[chose[i]])
res = []
back(nums,[])
return res