首页 > 其他分享 >77. 组合

77. 组合

时间:2024-05-30 19:58:56浏览次数:7  
标签:组合 backtrack int List 77 start result path

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

from typing import List

class 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 开始遍历到 n
            for i in range(start, n + 1):
                # 将当前数字加入路径
                path.append(i)
                # 递归调用,继续生成组合,起始数字变为 i + 1
                backtrack(i + 1, path)
                # 回溯,移除路径中的最后一个数字
                path.pop()
        
        # 从 1 开始生成组合
        backtrack(1, [])
        return result

详细中文注释

  1. 导入必要的库

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

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

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

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

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

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

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

    return result
    

示例

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

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

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

标签:组合,backtrack,int,List,77,start,result,path
From: https://blog.csdn.net/weixin_46460463/article/details/139243005

相关文章

  • HTML拆分与共享方式——多HTML组合技术
    作者:私语茶馆1.应用场景    如果是一个产品级的Web项目,往往非常多的页面部分是重复的(为保持风格一致),每个HTML页面将这些重复部分重新写一次,既带来极大的工作量,也造成后续修改不便。    因此会考虑到将一个HTML的不同部分拆分为多个HTML页面,利用类似Include......
  • AJ-Report 认证绕过与远程代码执行漏洞(CNVD-2024-15077)
    AJ-Report是全开源的一个BI平台。在其1.4.0版本及以前,存在一处认证绕过漏洞,攻击者利用该漏洞可以绕过权限校验并执行任意代码。补丁对比方法一从docker拖出代码,去gitee下载发行版,便于对比编译后的class。方法二查看git的commit记录,可以直接看到修改了哪些内容!后面要去学习......
  • GB-T 7714-2015
    [1]刘加林、多功能一次性压舌板:中国,92214985.2IP]1993-04-14.[2]河北绿洲生态环境科技有限公司.一种荒漠化地区生态植被综合培育种植方法:中国,01129210.5[P/OL].2001-10-24[2002-05-28].htp:/211.152.9.47/sipoasp/zlijs/hyjs-yxnewasp?recid=0129210.5&leixin.[3]KOSEKIA,M......
  • 组合数学
    组合数学(学习笔记)2.1四个基本计数原理加法原理:集合\(S\)被划分成两两不相交的部分\(S_1,S_2,S_3,\cdots,S_m\),则\[|S|=|S_1|+|S_2|+|S_3|+\cdots+|S_m|\]乘法原理:集合\(S\)的元素是有序对\((a,b)\),\(a\)来自大小为\(p\)的集合,\(b\)来自大小为\(q\)的集合,则\[|S|=p......
  • 组合数学(文章)
    组合数学Part1.基础的排列组合加法原理和乘法原理加法原理(分类计数原理):完成一件事,有\(n\)类办法,如果在第\(1\)类办法中有\(m_1\)种不同的方法,在第\(2\)类办法中有\(m_2\)种不同的方法,…,在第\(n\)类办法中有\(m_n\)种不同的方法,那么完成这件事共有:\(N=m_1+m_2......
  • [BZOJ2720 Violet 5]列队春游(概率期望+组合数学)
    列队春游问题描述输入格式:输出格式:样例输入:3123样例输出:4.33提示思路根据期望的线性性质,我们可以枚举每种可能的视野,然后求和对于每种视野,其期望为该种视野的视野长度*该种视野的概率设某个小朋友的视野期望为\(ans\),她的视野长度为\(L\)由于前面......
  • 「杂题乱刷」CF1977B
    题目链接CF1977B(luogu)CF1977B(codeforces)解题思路考虑通用做法。我们发现如果直接用二进制来表示的话这个数会只包含\(0,1\)这两个数字。发现这时阻碍我们构造的是连续的数字\(1\)。考虑消除连续的数字\(1\)。容易发现连续的数字\(1\)可以转化成将这一段最高位......
  • 「杂题乱刷」CF1977C
    题目链接CF1977C(luogu)CF1977C(codeforces)解题思路首先这题有一个简单的思路,就是当这个序列的LCM大于\(10^9\)时,显然取所有数字数字是合法的。然后我们接下来考虑LCM小于等于\(10^9\)的情况。发现这种情况LCM很小,且有一个简单的结论,就是你在序列中任选一个子......
  • LeetCode-2877. 从表中创建 DataFrame
    2877.从表中创建DataFrame编写一个解决方案,基于名为student_data的二维列表创建一个DataFrame。这个二维列表包含一些学生的ID和年龄信息。DataFrame应该有两列,student_id和age,并且与原始二维列表的顺序相同。返回结果格式如下示例所示。示例1:输入:student_data:[......
  • 力扣刷题记录: 2134. 最少交换次数来组合所有的 1 Ⅱ
        这道题是第275场周赛的Q2,LC竞赛分为1748,主要考察滑动窗口。说实话这道题要想到是滑动窗口就很简单,否则就根本无从下手。方法一.滑动窗口(时间超过62.53%C++用户)        处理环形数组的一个很有效的技巧就是“追加”,把整个nums数组追加到nums数组后面,......