day24 代码随想录算法训练营 77.组合--剪枝优化

题目:

还是组合

我的感悟:

  • 多看看别人写的,找一找自己更好理解的。
  • 看了灵山的,和卡尔的,最后在卡尔视频下面的评论找到我更理解的。

理解难点:

  • 注意距离的概念
  • 其他都不动,就增加一行,如果后续的长度不够了。就break

代码优化后的:

from typing import List


class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        res = []
        self.backtrack(n, k, 1, [], res)
        return res

    def backtrack(self, n, k, start_index, tmp_path, result):
        # 特殊
        if len(tmp_path) == k:  # 满足要求就记录
            result.append(tmp_path[:])
            return
        # 核心

        for i in range(start_index, n + 1):  # 要取到n
            if n + 1 - i < k - len(tmp_path):  # i是开始位置,如果从i开始到n+1的长度, 小于所需要的长度,就不要后面的了【注意这里是距离,距离的概念】
                break

            tmp_path.append(i)
            self.backtrack(n, k, i + 1, tmp_path, result)
            tmp_path.pop()

 

今日独立再写一次:

class Solution:
    def combine(self, n: int, k: int) -> List[List[int]]:
        res = []
        self.backtrack(n,k,1,[],res)
        return res
    def backtrack(self,n,k,start,path,result):
        # 特殊
        if len(path) == k:
            result.append(path[:])
        # 核心遍历
        for i in range(start,n+1):
            if n+1 -i < k - len(path):  # 剪枝 如果后面的不够需要的就跳过
                break
            path.append(i)
            self.backtrack(n,k,i+1,path,result)
            path.pop()

资料:

B站的评论

posted @ 2024-01-24 15:00  o蹲蹲o  阅读(1)  评论(0编辑  收藏  举报