回溯算法理论:
Leetcode 77. 组合
其实最主要的思路就是搞明白我们是怎么把递归和for 循环一起运用的,主要就是要理解我们是在for 循环中选择剩余部分的可能的组合,然后用过向下递归去
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
path = []
res = []
def backtracking(n, k, path, res, start_index):
# base case
if len(path) == k:
res.append(path[:])
return
# recursive case
for i in range(start_index, n + 1):
path.append(i)
backtracking(n, k, path, res, i + 1)
path.pop()
backtracking(n, k, path, res, 1)
return res
剪枝操作后:
这道题的剪枝操作其实思路上也不难理解
就是说当我们在进行递归的时候,如果剩余的数字数量已经不够让我们满足path所需要的长度的时候,就没有必要再继续从那个start index往下分支去找path了,比如上图的情况中我们需要k=4的时候,在一开始start index是1的时候,我们能找到1,2,3,4 但是当我们的start index是2并且path回到只有一个元素的时候,我们最多只能取到2,3,4 反正也凑不够k