#78
Medium
回溯

Subsets

返回数组的所有子集。

BacktrackingBit Manipulation

题目定位

这是最基础的回溯决策树:每个元素要么选、要么不选。同时它也能用位枚举实现,因此是连接回溯和位运算的好题。

关键观察

每个下标都对应一个二元决策,因此整个答案空间就是一棵深度为 n 的决策树。

目标复杂度

O(n * 2^n) / O(n)

这题的解法思路怎么拆

1

这是最基础的回溯决策树:每个元素要么选、要么不选。同时它也能用位枚举实现,因此是连接回溯和位运算的好题。

2

每个下标都对应一个二元决策,因此整个答案空间就是一棵深度为 n 的决策树。

3

先把决策树结构建出来。

4

确定当前层候选集怎么生成。

参考实现

Python
# Generic pattern template
def backtrack(path):
    if complete(path):
        answer.append(path[:])
        return
    for choice in choices(path):
        if not valid(choice, path):
            continue
        path.append(choice)
        backtrack(path)
        path.pop()

常见坑点

warning

把 path 直接塞进答案,没有复制。

warning

把组合题写成排列题的 used 数组逻辑。

高频追问

如果改成 bitmask 枚举,结构会怎样?

如果数组里有重复元素,回溯怎么改?

继续刷相关题

先把 回溯 这个模式刷成体系,再去做更难变体。

view_week回到模式页
LeetCode 78. Subsets 题解思路 | Interview AiBox