当前位置: 首页 > news >正文

【LeetCode77】组合

题目描述

给定区间 [1, n] 和一个整数 k,需要返回所有可能的 k 个数的组合。

思路

  1. 算法选择:回溯算法
    回溯算法是一种试探性搜索方法,非常适合用来解决组合问题。基本思想是:
    • 从数字 1 开始,逐步构建组合。
    • 当当前组合的长度等于 k 时,将该组合加入结果集。
    • 否则,继续尝试添加后续的数字。
    • 在尝试过程中,每一步都“做出选择”并递归,递归返回后撤销该选择(即“回溯”),从而探索其他可能的组合。
  2. 剪枝优化
    为了提高效率,可以在遍历时进行剪枝:
    • 如果当前已选数字个数加上剩余可选数字总数仍然不足以达到 k,则可以直接退出循环,避免不必要的递归调用。

代码

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

        # param path: 当前已经选择的数字组合
        def backtrack(start: int, path: List):
            if len(path) == k:
                res.append(path.copy())
            for i in range(start, n + 1): # 遍历从 start 到 n 的所有数字,注意区间的开闭
                # 剪枝:如果剩余数字数量不足以填满组合,则直接退出
                if len(path) + (n - i + 1) < k:
                    break
                 # 选择当前数字 i,加到当前组合中
                path.append(i)
                # 递归调用,从下一个数字开始继续选择
                backtrack(i + 1, path)
                # 回溯:撤销选择,将数字 i 从当前组合中删除
                path.pop()
        backtrack(1, [])
        return res

总结

  1. 回溯算法核心思想

    • 递归构造:用一个递归函数 backtrack 来构造组合,每次递归选择一个数字加入到当前组合 path 中。
    • 结束条件:当 path 的长度等于 k 时,将当前组合复制后加入结果集 res,然后结束当前递归分支。
    • 回溯撤销:递归调用返回后,使用 path.pop() 撤销上一次选择,从而恢复到上一步的状态,准备尝试其他选择。
  2. 剪枝优化技巧
    在 for 循环中,通过判断 len(path) + (n - i + 1) < k 来判断剩余的数字数量是否足够凑齐 k 个数。如果不足,则直接 break,避免无谓的递归调用,从而提高效率。
    由于需要枚举所有的组合,在最坏情况下,组合数量会非常大,但通过剪枝可以在一定程度上减小实际递归调用的次数。

  3. 递归与状态保存:在递归过程中,path 用于保存当前构造的组合状态,使用 path.copy() 保证加入结果集的是当前状态的一个副本,避免后续修改影响已经保存的组合

相关文章:

  • JS dom节点
  • Django分页教程及示例
  • 【Kafka基础】topics命令行操作大全:高级命令解析(2)
  • 深度解析 C# 中介者模式:设计与实战应用
  • vue3实现markdown工具栏的点击事件监听
  • Python设计模式:构建模式
  • 检测手机插入USB后,自动启动scrcpy的程序
  • C++建造者模式进化论
  • leetcode155.最小栈
  • 【lodash的omit函数详解 - 从入门到精通】
  • Solidity智能合约漏洞类型与解题思路指南
  • 用Python 还是C\C++ 开发嵌入式物联网项目
  • 使用Python快速删除Docker容器、镜像和存储内容
  • oracle 游标的管理
  • ubuntu安装docker和docker-compose【简单详细版】
  • Git工作流、命令汇总
  • 【GEE学习笔记】报错解决:Sentinel-2 数据集分为 L1C(大气顶层)和 L2A(地表反射率),如何选择波段进行去云处理?
  • 图论:单源最短路(BF算法+迪杰斯特拉算法+spfa算法)
  • 制定大运维管理体系的标准、流程、机制、规范
  • SolidWorks2025三维计算机辅助设计(3D CAD)软件超详细图文安装教程(2025最新版保姆级教程)
  • 美国新泽西客运公司遭遇罢工:40年来首次,35万人受影响
  • 试点首发进口消费品检验便利化措施,上海海关与上海商务委发文
  • 国家统计局:2024年城镇单位就业人员工资平稳增长
  • 李成钢:近期个别经济体实施所谓“对等关税”,严重违反世贸组织规则
  • “16+8”“生酮饮食”,网红减肥法究竟靠谱吗?
  • 2000多年前的“新衣”长这样!马王堆文物研究新成果上新