• 代码随想录算法训练营第二十四天| LeetCode77. 组合


    一、回溯算法

    有递归就有回溯,回溯通常都在递归函数的下方,可看视频:回溯算法

    回溯算法三部曲:

            1:确定递归函数的参数和返回值

            2:确定终止条件

            3:单层递归逻辑

    二、LeetCode77. 组合

            1:题目描述(77. 组合

            给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

            你可以按 任何顺序 返回答案。

            2:解题思路(视频详解

    1. class Solution:
    2. def combine(self, n: int, k: int) -> List[List[int]]:
    3. res = [] # 存放所有符合要求的组合结果
    4. path = [] # 存放每个符合要求的组合
    5. # 确认递归函数的参数和返回值
    6. def pathcombine(n, k, startsize):
    7. # n表示范围[1,n]的n
    8. # k表示k个数的组合
    9. # startsize表示每个组合的开始位置
    10. # 确定终止条件
    11. if len(path) == k:
    12. # 当path的大小等于k的时候,表示此时的path中的组合满足了题意
    13. # 就需要将path加入到res中
    14. res.append(path[:])
    15. # 加入后,然后返回上一层
    16. return
    17. # 单层递归逻辑
    18. for i in range(startsize, n+1):
    19. # 每层递归,i都是从startsize开始,到n+1结束,因为range()函数,左闭右开
    20. path.append(i)
    21. # 进入递归,下一层递归函数的开始位置是从当前位置的下一个位置开始
    22. # 所以startsize是i+1
    23. pathcombine(n, k, i+1)
    24. # 回溯,符合条件后,需要把加进来的元素pop出去
    25. path.pop()
    26. pathcombine(n, k, 1)
    27. return res

            进行优化:剪枝

    假如n=4,k=3,那么组合就是[1,2,3],[1,3,4],[2,3,4];我们就不需要再从3开始遍历进行取值,因为就算取了值,最后的长度也不符合要求,所以进行一个剪枝操作

    1. class Solution:
    2. def combine(self, n: int, k: int) -> List[List[int]]:
    3. res = [] # 存放所有符合要求的组合结果
    4. path = [] # 存放每个符合要求的组合
    5. # 确认递归函数的参数和返回值
    6. def pathcombine(n, k, startsize):
    7. # 确定终止条件
    8. if len(path) == k:
    9. # 当path的大小等于k的时候,表示此时的path中的组合满足了题意
    10. # 就需要将path加入到res中
    11. res.append(path[:])
    12. return
    13. # 单层递归逻辑
    14. # 剪枝就是修改i的取值范围,可以将n+1修改为:n-(k-len(path))+1
    15. size = n-(k-len(path))+1 # k-len(path)表示还剩几个需要取
    16. for i in range(startsize, size+1):
    17. # 每层递归,i都是从startsize开始,到size+1结束,因为range()函数,左闭右开
    18. path.append(i)
    19. # 进入递归,下一层递归函数的开始位置是从当前位置的下一个位置开始
    20. # 所以startsize是i+1
    21. pathcombine(n, k, i+1)
    22. # 回溯,符合条件后,需要把加进来的元素pop出去
    23. path.pop()
    24. pathcombine(n, k, 1)
    25. return res
  • 相关阅读:
    SpringMVC(八):SSM整合
    Mysql优化---SQL优化准备和explain中的id、table
    Android finishInputEvent 流程分析
    MR素数测试及 pycryptodome库下 已知MR伪素数以及强伪证 生成指定伪随机数生成器绕过素性检测
    全向移动机器人运动参数校准
    LabVIEW-IMAQ/IMAQdx/图像采集
    【多线程】进程与线程
    【前端设计模式】之观察者模式
    精品基于Uniapp+SSM实现的公园植物介绍APP
    百度C++研发工程师面试题(最新整理)
  • 原文地址:https://blog.csdn.net/weixin_48323589/article/details/127697220