day155—回溯—组合(LeetCode-77)

题目描述

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

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

示例 1:

输入:n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]

示例 2:

输入:n = 1, k = 1输出:[[1]]

提示:

  • 1 <= n <= 20
  • 1 <= k <= n

解决方案:

这段代码的核心功能是生成从 1 到 n 的数字中选取 k 个数字的所有组合(组合不考虑顺序,比如 n=4、k=2 时,输出[[4,3],[4,2],[4,1],[3,2],[3,1],[2,1]]),采用「回溯 + 剪枝」的思路实现,是组合问题的经典高效解法。

核心逻辑

  1. 成员变量作用

    • path:临时数组,存储当前正在构造的组合(比如选取了 2 个数字时,path 可能是 [4,3]);
    • ans:最终结果数组,存储所有符合条件的 k 个数组合。
  2. 递归函数dfs逻辑

    • 参数n:当前可选数字的上界(只能从1~n中选数);k:需要选取的数字个数;
    • 剪枝条件(提前终止无效递归):if(n < k - len)—— 剩余可选数字个数(n)小于 “还需要选的数字个数(k-len)”,说明不可能凑够 k 个数,直接返回,避免无效递归;
    • 终止条件:if(len == k)—— 当前组合的长度等于 k,说明已选够 k 个数,将path加入ans后返回;
    • 核心流程(从大到小枚举 + 回溯):① 遍历从n1的所有数字i(从大到小选,避免重复组合,比如不会同时出现 [3,4] 和 [4,3]);② 选数字i:将i加入path,递归调用dfs(i-1, k)(下一轮只能从1~i-1中选数,保证组合内数字递减,无重复);③ 回溯:递归返回后,执行path.pop_back()删掉刚加入的数字,尝试下一个可选数字。
  3. 主函数combine

    • 从数字上界n开始调用dfs,启动组合构造过程;
    • 最终返回存储所有 k 数组合的ans

关键特点

  • 剪枝优化:n < k - len的判断是核心优化点,能大幅减少递归次数(比如 n=5、k=3,当前 path 长度为 1,还需选 2 个数,若剩余可选数字只有 1 个,直接终止);
  • 去重逻辑:从大到小枚举数字,且下一轮只能选更小的数字,天然保证组合内数字递减,避免生成重复组合(组合不考虑顺序,此逻辑符合组合的定义)。

总结

  1. 核心思路:递归枚举可选数字,从大到小选数避免重复组合,通过剪枝提前终止无效递归,回溯遍历所有合法的 k 数组合;
  2. 关键操作:path.push_back()(选数)和path.pop_back()(回溯)是遍历所有组合的核心,剪枝条件是提升效率的关键;
  3. 功能效果:能输出 1~n 中选 k 个数的所有组合,无重复、无遗漏,且效率高于无剪枝的暴力枚举。

以 n=4、k=2 为例,最终会生成所有 2 数组合:[[4,3],[4,2],[4,1],[3,2],[3,1],[2,1]],符合组合的定义(不考虑顺序)。

函数源码:

class Solution { public: vector<int>path={}; vector<vector<int>>ans={}; void dfs(int n,int k){ int len=path.size(); if(n<k-len){ return; } if(len==k){ ans.push_back(path); return; } for(int i=n;i>0;i--){ path.push_back(i); dfs(i-1,k); path.pop_back(); } } vector<vector<int>> combine(int n, int k) { dfs(n,k); return ans; } };

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1185368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索机器视觉贴片机控制软件系统源码

机器视觉贴片机控制软件系统源码 机器视觉贴片机控制系统源码2套(全套源程序和图纸) 软件界面图片&#xff1a;嘿&#xff0c;各位技术小伙伴们&#xff01;今天咱来唠唠机器视觉贴片机控制软件系统源码这有意思的玩意儿&#xff0c;而且咱手里还握着2套全套源程序和图纸呢&am…

实用指南:零基础学AI大模型之MultiQueryRetriever多查询检索全解析

实用指南:零基础学AI大模型之MultiQueryRetriever多查询检索全解析2026-01-19 22:07 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !…

告别嘈杂!Moodist%20白噪音神器,搭配%20cpolar%20解锁随时随地的宁静

Moodist 作为一款沉浸式环境音效生成器&#xff0c;核心功能是将雨打屋檐、篝火噼啪、山间溪流等数十种自然与生活音效拆分为独立模块&#xff0c;用户可自由调配比例&#xff0c;打造专属治愈音效&#xff0c;适配职场人、学生党、宝妈等各类需要舒缓环境的人群&#xff0c;其…

基于Hough变换的答题卡识别MATLAB之旅

9.基于Hough变化的答题卡识别 MATLAB程序 答题卡自动阅卷系统通过获取答题卡图像作为系统输入&#xff0c;并通过计算机处理、自动识别填图标记&#xff0c;存入数据库完成阅卷。但是答题卡在运输和使用过程中&#xff0c;容易受到设备、环境等因素的影响&#xff0c;使得图像质…

计算机小程序毕设实战-基于django+微信小程序的运动饮食健康生活系统【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

C# 实现 TCP/IP 客户端与服务器数据交互及与西门子 S7 - 200Smart 通讯

C# TCP IP 客户端和服务器工程源码&#xff0c;带注释&#xff0c;里面含有以字节、字、浮点型数据、字符串数据进行数据交互的客户端与服务器源码&#xff0c;可实现中英文字符串实现聊天&#xff0c;本图为与西门子S7-200Smart通讯为例在 C# 的编程世界里&#xff0c;实现 TC…

Day23-20260119

本文介绍了Java数组的基本概念和使用方法。数组是相同类型数据的有序集合,通过索引访问元素。主要内容包括:数组的声明和创建(使用new操作符)、内存分析(堆、栈、方法区)、三种初始化方式(静态、动态和默认初始…

【计算机毕业设计案例】基于微信小程序的考研资源共享平台的设计与实现基于django+微信小程序的考研信息查询系统(程序+文档+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

c++中的常用栈操作

核心代码如下: include include include using namespace std; int main() { stack st; //1.入栈 st.push(A); st.puch(B); st.push(C); cout<<"栈的大小:"<<st.size()<<endl;//2.访问栈…

PySide系列-07-QMainWindow

PySide step by step系列 1、QMainWindow QMainWindow 是一个继承自 QWidget 的类&#xff0c;专门设计用来作为主应用程序窗口。它内置了多个标准的 GUI 组件区域&#xff0c;方便开发人员快速搭建界面。 QMainWindow 提供了以下几个核心区域&#xff08;布局区域&#xff…

2026/1/17-Atcoder Beginner Contest 441 T1~4

前言 比赛的时候只写了A~E后面结束后补,比赛链接:Atcoder 441 致力于把题目用通俗的语言翻译出来,让新人也能看懂A 只要X Y范围在 (P,Q) 和 (P+99,Q+99)范围之间就成立 B 只要分成两个集合A,B 字符串中每一个字符都去…

群友靶机lara复现 - 场

lara靶机lara nmap -p- 192.168.10.13 Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-18 07:21 EST Nmap scan report for lara (192.168.10.13) Host is up (0.00085s latency). N…

小程序毕设选题推荐:基于django+微信小程序的健康生活系统个人健康生活平台小程序【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

信件分析(2)

学习构建北京市政百姓信件分析实战案例,完成 (1) 采集北京市政百姓信件内容; (2) 编写 MapReduce 程序清洗信件内容数据; (3) 利用 HiveSql 语句离线分析信件内容数据; (4) 利用 Sqoop 导出 Hive 分析数据…

探索人脸识别追踪:从图像采集到电机驱动的奇妙旅程

人脸识别追踪。 图像采集识别和电机驱动系统&#xff0c;利用openmv图像识别对人脸进行实时采集&#xff0c;采集信号传入到单片机&#xff0c;根据分析结果利用matlab-PID算法控制电机系统跟随人脸运动&#xff0c;自动检测追踪在科技飞速发展的当下&#xff0c;人脸识别追踪技…

​​​​​​​推荐10个数据备份与恢复工具?先搞懂这3种备份方式,再选才不踩坑!

在中小企业或个人用户的数据管理实践中&#xff0c;“备份”常被当作最后一道防线。但很多人装了工具、设了任务&#xff0c;真到需要恢复时却发现&#xff1a;要么文件没同步&#xff0c;要么版本不对&#xff0c;甚至整个备份链已损坏。问题往往不在工具本身&#xff0c;而在…

ACPI!gReadyQueue中的plistCtxtQ和ACPI!GetOpRegionScopeWorker函数中的赋值*state->PciObj = state->Parent

ACPI!gReadyQueue中的plistCtxtQ和ACPI!GetOpRegionScopeWorker函数中的赋值*state->PciObj state->Parent1: kd> g Breakpoint 3 hit eax00000800 ebx00000000 ecx89d7f270 edx89db4e50 esi89db3410 edi00000800 eipf740d4fa espf791ac5c ebpf791ac68 iopl0 …

FPGA 实现多路高精度 AD1246 高速数据采集与接收设计

FPGA高速数据接收设计&#xff0c;多路高精度AD1246数据采集在当今数字化时代&#xff0c;对于高速、高精度的数据采集需求日益增长。FPGA&#xff08;现场可编程门阵列&#xff09;以其灵活的可编程性和强大的并行处理能力&#xff0c;成为实现高速数据采集系统的理想选择。本…

手把手教你降AI不伤文:保姆级操作让论文既通过检测又保持专业

手把手教你降AI不伤文&#xff1a;保姆级操作让论文既通过检测又保持专业 TL;DR&#xff1a;降AI率最怕的就是把专业术语改没了、论文变得不伦不类。本文教你如何实现「降AI不伤文」&#xff1a;选对工具&#xff08;推荐嘎嘎降AI&#xff09;、分段处理、处理后校对。掌握这套…

微分方程一维抛物热传导方程数值解法全解析

微分方程一维抛物热传导方程向前向后欧拉C-N格式二阶BDF格式MATLAB源码 显式欧拉&#xff0c;隐式欧拉&#xff0c;梯形公式&#xff0c;改进欧拉 五点差分&#xff0c;九点差分 差分格式&#xff0c;紧差分格式 直拍&#xff0c;只有pdf版方法说明 word版 公式纯手打 数值例子…