子集问题

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]]

提示:

解题思路

解题思路图片摘自代码随想录 0078.子集.html#思路
3682123565c88a356fb9905699039115_MD5.png

回溯函数

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()