子集问题
78. 子集 - 力扣(LeetCode)
90. 子集 II - 力扣(LeetCode)
题目
给你一个整数数组 nums
,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入: nums = [1,2,3]
输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
**输入:**nums = [0]
输出: [[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums
中的所有元素 互不相同
解题思路
解题思路图片摘自代码随想录 0078.子集.html#思路
回溯函数:
def getsub(self,nums,start,tmp,res):
结束条件:
如果start大于等于列表长度,就返回
if start >= len(nums):
return
本题中,循环结束
遍历过程:
注意
注意
收集子集时,要放在终止添加的上面。
放在遍历开头,在每次遍历的时候将本身加入
放在终止条件后,每一个for循环结束后才将结果加入,如示例1的结果将变成[[1,2,3],[1,3],[2,3],[3]]
res.append(tmp[:])
for i in range(start,len(nums)):
tmp.append(nums[i])
self.getsub(nums,i+1,tmp,res)
tmp.pop()
代码
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
res = []
self.getsub(nums, 0, [], res)
return res
def getsub(self,nums,start,tmp,res):
# 收集子集,要放在终止添加的上面
# 放在遍历开头,在每次遍历的时候将本身加入
# 放在终止条件后,每一个for循环结束后才将结果加入,[[1,2,3],[1,3],[2,3],[3]]
res.append(tmp[:])
# if start>=len(nums):
# return
for i in range(start,len(nums)):
tmp.append(nums[i])
self.getsub(nums,i+1,tmp,res)
tmp.pop()