回溯法backtracking三部曲
回溯法是为了解决k层for循环嵌套的问题,本质上是暴力解法
- 返回值以及参数
- 终止条件
- 遍历过程
backtracking(params):
if end_condition:
store result
return
for element in this level: # 可以用剪枝优化
process the node
backtracking(path, startindex) # 递归
# 回溯,撤销已经处理的节点
但是可以用剪枝进行优化
77. 组合
- 终止条件:遇到叶子节点/长度达到k
- 遍历过程:用for循环进行横向遍历,用递归进行纵向遍历
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
result = []
self.backtracking(n, k, 1, [], result)
return result
def backtracking(self, n, k, startIndex, path, result):
if len(path) == k:# 终止条件
result.append(path[:]) # 传入的是path[:],而不是path
return
for i in range(startIndex, n+1):
path.append(i)
self.backtracking(n, k, i+1, path, result)
path.pop() # 回溯,撤销已经处理的节点
剪枝优化版:
class Solution(object):
def combine(self, n, k):
"""
:type n: int
:type k: int
:rtype: List[List[int]]
"""
result = []
self.backtracking(n, k, 1, [], result)
return result
def backtracking(self, n, k, startIndex, path, result):
if len(path) == k:# 终止条件
result.append(path[:]) # 传入的是path[:],而不是path
return
for i in range(startIndex, n-(k-len(path))+2):
path.append(i)
self.backtracking(n, k, i+1, path, result)
path.pop() # 回溯,撤销已经处理的节点