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

77.组合问题

主函数 combine
def combine(self, n: int, k: int) -> List[List[int]]:result = []  # 存放所有有效的组合self.backtracking(n, k, 1, [], result)  # 从数字1开始搜索return result
  • 作用:初始化并启动回溯过程。
  • 参数
    • n=4:数字范围是1到4。
    • k=2:每个组合需要2个数字。
  • 过程
    1. 创建空列表 result 存储结果。
    2. 调用 backtracking 开始递归搜索。
回溯函数 backtracking
def backtracking(self, n, k, startIndex, path, result):if len(path) == k:          # 终止条件:当前组合已选够k个数result.append(path[:])   # 将当前组合存入结果returnfor i in range(startIndex, n + 1):  # 遍历可选数字path.append(i)           # 选择当前数字iself.backtracking(n, k, i + 1, path, result)  # 递归处理下一个数字path.pop()               # 回溯:撤销选择i

具体执行步骤(以 n=4, k=2 为例)

1. 主函数调用 backtracking(4, 2, 1, [], result)
  • startIndex = 1path = []
  • 进入循环 for i in range(1, 5):
    • i = 1:

      • path.append(1) → path = [1]
      • 递归调用 backtracking(4, 2, 2, [1], result):
        • startIndex = 2path = [1]
        • 子循环 for i in range(2, 5):
          • i = 2:
            • path.append(2) → path = [1, 2]
            • path = [1]
              path.append(2)       # path = [1,2]
              # 现在调用 backtracking(n,k,3,[1,2],result)
              # ↓ 进入新的递归层级
              if len([1,2]) == 2:  # 立刻触发检查!result.append([1,2])return           # 直接返回,不会继续后面的循环
              # 回到上一层
              path.pop()          # path恢复为[1]

              对下面的解释

            • 满足 len(path) == 2:
              • result.append([1, 2]) → result = [[1, 2]]
            • path.pop() → path = [1] (回溯)
          • i = 3:
            • path.append(3) → path = [1, 3]
            • 满足 len(path) == 2:
              • result.append([1, 3]) → result = [[1, 2], [1, 3]]
            • path.pop() → path = [1] (回溯)
          • i = 4:
            • path.append(4) → path = [1, 4]
            • 满足 len(path) == 2:
              • result.append([1, 4]) → result = [[1, 2], [1, 3], [1, 4]]
            • path.pop() → path = [1] (回溯)
        • 子递归结束,返回上一层。
      • path.pop() → path = [] (回溯)
    • i = 2:

      • path.append(2) → path = [2]
      • 递归调用 backtracking(4, 2, 3, [2], result):
        • startIndex = 3path = [2]
        • 子循环 for i in range(3, 5):
          • i = 3:
            • path.append(3) → path = [2, 3]
            • 满足 len(path) == 2:
              • result.append([2, 3]) → result = [[1, 2], [1, 3], [1, 4], [2, 3]]
            • path.pop() → path = [2] (回溯)
          • i = 4:
            • path.append(4) → path = [2, 4]
            • 满足 len(path) == 2:
              • result.append([2, 4]) → result = [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4]]
            • path.pop() → path = [2] (回溯)
        • 子递归结束,返回上一层。
      • path.pop() → path = [] (回溯)
    • i = 3:

      • path.append(3) → path = [3]
      • 递归调用 backtracking(4, 2, 4, [3], result):
        • startIndex = 4path = [3]
        • 子循环 for i in range(4, 5):
          • i = 4:
            • path.append(4) → path = [3, 4]
            • 满足 len(path) == 2:
              • result.append([3, 4]) → result = [[1, 2], [1, 3], [1, 4], [2, 3], [2, 4], [3, 4]]
            • path.pop() → path = [3] (回溯)
        • 子递归结束,返回上一层。
      • path.pop() → path = [] (回溯)
    • i = 4:

      • path.append(4) → path = [4]
      • 递归调用 backtracking(4, 2, 5, [4], result):
        • startIndex = 5 > n = 4,直接返回,不处理。
      • path.pop() → path = [] (回溯)
http://www.xdnf.cn/news/4772.html

相关文章:

  • 基于Partial Cross Entropy的弱监督语义分割实战指南
  • ElasticSearch基本概念
  • Abaqus学习笔记
  • 解锁 LLM 推理速度:深入 FlashAttention 与 PagedAttention 的原理与实践
  • 如何对 Oracle 日志文件进行校验
  • AUBO STUDIO简介
  • Milvus(17):向量索引、FLAT、IVF_FLAT
  • 在现代Web应用中集成 PDF.js (pdfjs-dist 5.2 ESM): 通过 jsdelivr 实现动态加载与批注功能的思考
  • TDengine 在新能源行业应用
  • Java 线程全面概述
  • 在Excel图表添加辅助线
  • 在 YAFFS2 文件系统中,`yaffs_pread` 函数详解
  • 2.3 点云数据存储格式——LiDAR专用型点云存储格式
  • 003.chromium编译进阶-禁用css动画和禁用canvas渲染
  • 【最新版】likeshop连锁点餐系统-PHP版+uniapp前端全开源
  • 【LangChain基础系列】深入全面掌握文本分类
  • pyorch中tensor的理解与操作(一)
  • java后端知识点复习
  • 图表制作-基础面积图
  • 在openEuler系统下编译安装Redis数据库指南
  • 「美业疗愈服务」从“表层美”到“身心整合”的行业变革︳博弈美业疗愈系统分享
  • GoogLeNet详解
  • 如何通过grep 排除“INTEGER: 1”
  • IoT平台和AIoT平台的区别
  • 如何使用极狐GitLab 软件包仓库功能托管 ruby?
  • 基于机器学习的攻击检测与缓解,以及 SDN 环境中的多控制器布局优化
  • Spring Boot + Vue 实现在线视频教育平台
  • 实践005-Gitlab CICD全项目整合
  • git 合并分支
  • 网工实验——OSPF配置