回溯

回溯问题分为子集型、组合型、排列型; 子集型与组合型除了答案的视角(枚举选哪个)还有一种输入的视角(选或不选)

灵神的三问 还可以补充一个 回溯函数终止条件

Alt text

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        ans = []
        path = []
        n = len(nums)
        def dfs(i: int) -> None:
            ans.append(path.copy())  # 复制 path
            for j in range(i, n):  # 枚举选择的数字
                path.append(nums[j])
                dfs(j + 1)
                path.pop()  # 恢复现场
        dfs(0)
        return ans
Alt text

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        ans = []
        path = []
        n = len(nums)

        def dfs(i: int) -> None:
            if i == n:  # 子集构造完毕
                ans.append(path.copy())  # 复制 path,也可以写 path[:]
                return

            # 不选 nums[i]
            dfs(i + 1)

            # 选 nums[i]
            path.append(nums[i])
            dfs(i + 1)
            path.pop()  # 恢复现场

        dfs(0)
        return ans
回到页面顶部