#39
Medium
回溯

Combination Sum

找出和为目标值的所有组合,候选数字可重复使用。

Backtracking

题目定位

这题的关键是递归中保留起始索引,从而避免排列式重复,同时又允许当前数字被重复使用。

关键观察

因为允许重复使用,所以当前索引可以再次选择;但一旦往后走,就不该再回到更早索引。

目标复杂度

Exponential / O(target)

这题的解法思路怎么拆

1

这题的关键是递归中保留起始索引,从而避免排列式重复,同时又允许当前数字被重复使用。

2

因为允许重复使用,所以当前索引可以再次选择;但一旦往后走,就不该再回到更早索引。

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

明明允许重复使用,却把 start 索引提前加一。

warning

剩余目标已经为负时还继续递归。

高频追问

Combination Sum II 的区别是什么?

为什么排序有利于这题剪枝?

继续刷相关题

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

view_week回到模式页
LeetCode 39. Combination Sum 题解思路 | Interview AiBox