回溯理论基础:
有递归必有回溯,回溯一般出现在递归之后,适用回溯算法的场景有:组合问题,切割问题,子集问题,排列问题,N皇后问题,解数独问题等
77、组合
class Solution(object):
def __init__(self):
self.res = []
self.path = []
def backtracking(self, n, k, start_index):
if len(self.path) == k:
self.res.append(self.path[:])
return
for i in range(start_index, n-(k-len(self.path))+2):
self.path.append(i)
self.backtracking(n, k, i+1)
self.path.pop()
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
self.backtracking(n, k, 1)
return self.res
回溯函数先写出终止条件,构造一个变量start_index来记录开始的索引,确保每一层递归的时候没有重复使用前值,self.path.pop()就是回溯操作,剪枝操作利用好可以优化代码执行效率