news 2026/4/23 14:14:44

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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; } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:19:18

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

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

作者头像 李华
网站建设 2026/4/23 9:59:22

汽车ABS模型仿真:探索防抱死制动系统建模之旅

汽车ABS模型仿真&#xff0c;防抱死制动系统建模 包括simulink建立的汽车ABS模型和Word文档详细说明如何对防抱死制动系统 (ABS) 进行建模。 它对车辆在紧急制动情况下的动态行为进行仿真。 仿真分析包括 在 ABS 模式下运行仿真、在无 ABS 的情况下运行仿真、带 ABS 的制动与不…

作者头像 李华
网站建设 2026/4/23 11:20:45

西门子S7200smart PLC与三菱FX3u PLC 的485 Modbus RTU通信之旅

西门子S7200smartPLC与三菱FX3uPlc做485Modbus RTU通信&#xff0c;西门子S7200smartPLC做主站轮训扫描读取写去数据转入三菱Plc&#xff01;通信已测试没有问题&#xff0c;最近成功实现了西门子S7200smart PLC与三菱FX3u PLC 通过485 Modbus RTU进行通信&#xff0c;并且西门…

作者头像 李华
网站建设 2026/4/23 9:55:27

文件系统(理解机械磁盘)

理解硬件&#xff1a;磁盘1.机械磁盘机械磁盘是计算机中唯一的一个机械设备&#xff0c;本节提到的磁盘均为机械磁盘2.磁盘物理结构3.磁盘的存储结构一个磁盘有数个盘&#xff0c;每个盘有两个盘面&#xff0c;每个盘面上都有磁头可以进行读写&#xff0c;每一个盘面上都有数个…

作者头像 李华
网站建设 2026/4/23 9:53:26

2026降AI工具红黑榜:实测8款后我只推荐这3个

2026降AI工具红黑榜&#xff1a;实测8款后我只推荐这3个 TL;DR&#xff1a;测了8款降AI工具&#xff0c;踩了不少坑。红榜推荐&#xff1a;嘎嘎降AI&#xff08;达标率99.26%&#xff0c;性价比最高&#xff09;、比话降AI&#xff08;不达标全额退款&#xff09;、AIGCleaner&…

作者头像 李华
网站建设 2026/4/23 9:59:07

SPV1050低功耗微功率太阳能充电管理模块原理图设计,已量产

目录 1、系统整体架构:从能量收集到负载供电 2、核心单元详解:SPV1050 微功率 MPPT 电路设计 2.1、选型逻辑:为什么是 SPV1050? 2.2、MPPT 算法:恒定电压比例的工程实现 2.3、能量转换与电池保护 2.4、3.3V 稳压输出 3、备用充电路径:TP4057 USB 线性充电电路 4、…

作者头像 李华