理论基础
题目链接:链接
77. 组合
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
题目链接:链接
自己理解题目:结合视频讲解的回溯算法模板就能做出来,但是前面的二叉树太难了吧。。。
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
path=[]
res=[]
def backtrace(n,k,left):
if len(path)==k:
res.append(path[:])
return
for i in range(left,n-k+len(path)+2):
path.append(i)
backtrace(n,k,i+1)
path.pop()
backtrace(n,k,1)
return res
参考代码:
未剪枝优化
class Solution:
def combine(self, n: int, k: int) -> 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[:])
return
for i in range(startIndex, n + 1): # 需要优化的地方
path.append(i) # 处理节点
self.backtracking(n, k, i + 1, path, result)
path.pop() # 回溯,撤销处理的节点
剪枝优化:
class Solution:
def combine(self, n: int, k: int) -> 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[:])
return
for i in range(startIndex, n - (k - len(path)) + 2): # 优化的地方
path.append(i) # 处理节点
self.backtracking(n, k, i + 1, path, result)
path.pop() # 回溯,撤销处理的节点
反思总结:链接