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

代码随想录--组合

posted @ 2024-01-22 20:55  o蹲蹲o  阅读(1)  评论(0编辑  收藏  举报