代码随想录算法训练营Day24
77. Combinations
回溯算法 核心精神: for循环横向遍历,递归纵向遍历,回溯不断调整结果集。
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
# 提示使用回溯算法
res = []
path = []
def backtrack(n, k, StartIndex):
if len(path) == k:
res.append(path[:])
return
for i in range(StartIndex, n + 1):
path.append(i)
backtrack(n, k, i+1)
path.pop() # 回溯
backtrack(n, k, 1)
return res
剪枝优化:
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
res=[] #存放符合条件结果的集合
path=[] #用来存放符合条件结果
def backtrack(n,k,startIndex):
if len(path) == k:
res.append(path[:])
return
for i in range(startIndex,n-(k-len(path))+2): #优化的地方
path.append(i) #处理节点
backtrack(n,k,i+1) #递归
path.pop() #回溯,撤销处理的节点
backtrack(n,k,1)
return res
因为nums = [0, …, n], 所以未优化时, i in range(startIndex, n+1)
, 注意startIndex从1开始.
优化:
- 还差
k-len(path)
个元素 - element(not index)最多逆向取
k-len(path)-1
, 因为此时,新元素还没有append进去 - “要取到n, 需要range(n+1)”, 同理,
n - (k-len(path)-1) + 1