day24 代码随想录算法训练营 回溯算法 77. 组合
题目:77. 组合
我的感悟:
- 先遇到问题,再去解决问题。
- 先做题,再去看总结。
- 不会的,先抄一遍。
理解难点:
- [] 是临时存放结果的,
- result 是最终存放结果的
- 因为从1-n,要包含n,所以,里面是n+1
代码示例:
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() # 回溯,撤销处理的节点
核心思路:
- 基于回溯的思想,对于startIndex到n的每一个元素,尝试将其加入path(一个可能的组合),然后再以此为基础继续向前探索,如果满足len(path)==k, 即找到一个有效的组合,将其添加到结果列表result中。如果len(path) < k ,将继续尝试添加新的元素到path中。当遍历完所有可能的元素的选择后,需要从path中移除最后添加的元素(path.pop()) ,这一步称为回溯。(也就是遍历到叶子节点后,记录答案。),返回到上一个状态继续尝试其他的可能的选择。
自己写发现:
- i和index要分清,index是上一轮的。
-
from typing import List class Solution: def combine(self, n: int, k: int) -> List[List[int]]: result = [] self.backtrack(n,k,1,[],result) return result def backtrack(self,n,k,index,path,result): # 原来2个参数,开始下标,临时变量,存放结果 if len(path) == k: result.append(path[:]) return None for i in range(index,n+1): # 易错点1:不能写(N+1) 要写(index,n+1) # 开始遍历从后面的遍历 path.append(i) self.backtrack(n,k,i+1,path,result) # 易错点2:这里是新的i 不是index,index是上一轮的, path.pop()
易错点2的进一步解释:
关于index下面这是一个更好的例子:
独立写了一遍:
资料:
gpt-4-1106-preview