77. 组合

embedded/2024/12/22 19:33:06/

77. 组合
要生成给定范围 [1, n] 中所有可能的 k 个数的组合,可以使用递归和回溯的方法。以下是详细的代码及注释:

python">from typing import Listclass Solution:def combine(self, n: int, k: int) -> List[List[int]]:result = []  # 用于存储所有组合结果def backtrack(start: int, path: List[int]):# 如果当前路径长度为 k,则将其加入结果if len(path) == k:result.append(path[:])return# 从 start 开始遍历到 nfor i in range(start, n + 1):# 将当前数字加入路径path.append(i)# 递归调用,继续生成组合,起始数字变为 i + 1backtrack(i + 1, path)# 回溯,移除路径中的最后一个数字path.pop()# 从 1 开始生成组合backtrack(1, [])return result

详细中文注释

  1. 导入必要的库

    python">from typing import List
    
    • List 用于类型注解,表示返回的结果是一个包含列表的列表。
  2. 定义解决方案类 Solution 及其方法 combine

    python">class Solution:def combine(self, n: int, k: int) -> List[List[int]]:
    
  3. 初始化用于存储所有组合结果的变量 result

    python">result = []
    
  4. 定义辅助递归函数 backtrack

    python">def backtrack(start: int, path: List[int]):
    
    • start 表示当前递归的起始数字。
    • path 表示当前组合的路径。
  5. 判断当前路径长度是否为 k

    python">if len(path) == k:result.append(path[:])return
    
    • 如果当前路径长度等于 k,将路径的副本加入结果中,并返回。
  6. start 开始遍历到 n

    python">for i in range(start, n + 1):path.append(i)backtrack(i + 1, path)path.pop()
    
    • 遍历从 startn 的数字。
    • 将当前数字加入路径中。
    • 递归调用 backtrack 函数,起始数字变为 i + 1
    • 回溯,将路径中的最后一个数字移除。
  7. 开始递归生成组合

    python">backtrack(1, [])
    
  8. 返回所有组合结果

    python">return result
    

示例

假设 n = 4k = 2,则调用 combine 函数将生成以下所有组合:

[[1, 2],[1, 3],[1, 4],[2, 3],[2, 4],[3, 4]
]

通过这种递归和回溯的方法,可以有效地生成范围 [1, n] 中所有可能的 k 个数的组合。


http://www.ppmy.cn/embedded/43199.html

相关文章

【Qt】事件

文章目录 1 :peach:事件介绍:peach:2 :peach:事件的处理:peach:3 :peach:按键事件:peach:3.1 :apple:单个按键:apple:3.2 :apple:组合按键:apple: 4 :peach:鼠标事件:peach:4.1 :apple:鼠标单击事件:apple:4.2 :apple:鼠标释放事件:apple:4.3 :apple:鼠标双击事件:apple:4.4 :a…

Java实现图书系统

首先实现一个图书管理系统,我们要知道有哪些元素? 1.用户分成为管理员和普通用户 2.书:书架 书 3.操作的是: 书架 目录 第一步:建包 第二步:搭建框架 首先:完成book中的方法 其次:完成BookList 然后:完成管理员界面和普通用户界面 最后:Main 第三步:细分方法 1.退…

博客说明 5/12~5/24【个人】

博客说明 5/12~5/24【个人】 前言版权博客说明 5/12~5/24【个人】对比最后 前言 2024-5-24 13:39:23 对我在2024年5月12日到5月24日发布的博客做一下简要的说明 以下内容源自《【个人】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作…

1. C++实现一个最简单的服务器和五种I/O模型

这只是一个简单的服务器, server.h 这个里面就是实现一个Server的类。然后一个run方法 /***Server class*author lipu123*date 2024-5-24*/#ifndef SERVER_H #define SERVER_H namespace avdance{class Server{ public:Server();~Server(); public:void run(); };}…

力扣239. 滑动窗口最大值

Problem: 239. 滑动窗口最大值 文章目录 题目描述思路复杂度Code 题目描述 思路 1.编写实现优先队列类: 1.1.实现push(int n):将元素n添加到队列尾,同时将n前面大于n的元素删除 1.2.实现int max():将队列头元素取出(由于实现了push所以此时队…

CLIP 论文的关键内容

CLIP 论文整体架构 该论文总共有 48 页,除去最后的补充材料十页去掉,正文也还有三十多页,其中大部分篇幅都留给了实验和响应的一些分析。 从头开始的话,第一页就是摘要,接下来一页多是引言,接下来的两页就…

【Rust日报】函数指针与闭包的区别

函数指针与闭包的区别 在 Rust 中,函数指针用于直接指向一个确定签名的函数,适用于不需要捕获外部环境的场景。相对闭包来说,函数指针语法简单,性能略高但不能保持状态。闭包则功能更强大,能够捕获和使用其定义时的环境…

Day01-python函数

目录 一、函数介绍 二、函数使用 2-1 语法格式 2-2 函数的基本定义和使用 2-3 函数参数 2-4 参数接收数据类型 2-5 函数的返回值 2-6 函数的文档 2-7 函数的嵌套调用 三、变量作用域 3-1 变量的引用 3-2 变量的分类 四、函数参数详解 五、函数的数据传递 5-1 将函…