题目定位
这是最基础的回溯决策树:每个元素要么选、要么不选。同时它也能用位枚举实现,因此是连接回溯和位运算的好题。
关键观察
每个下标都对应一个二元决策,因此整个答案空间就是一棵深度为 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 枚举,结构会怎样?
如果数组里有重复元素,回溯怎么改?
继续刷相关题
先把 回溯 这个模式刷成体系,再去做更难变体。