77. 组合(力扣LeetCode)

文章目录

  • 77. 组合
    • 题目描述
    • 回溯算法
    • 组合问题的剪枝操作

77. 组合

题目描述

给定两个整数 n 和 k,返回范围 [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

回溯算法

  • 对回溯算法不太了解的同学可以看这篇文章:回溯算法理论基础

  • 该题目的详细解析可以看这篇文章:第77题. 组合

看完这两篇文章后,可能有同学看懂了[12],[13],[14]组合中2,3,4是如何删除(回溯),但没看懂1是如何删除(回溯)的可以看下图:
在这里插入图片描述
代码如下:

// 定义解决方案类
class Solution {
public:// 组合的主要公共接口,返回所有可能的k个数的组合vector<vector<int>> combine(int n, int k) {// 从数字1开始进行回溯搜索backtracking(n, k, 1);// 返回搜索结果return result;}private:// 用来存放最终的组合结果vector<vector<int>> result;// 用于在递归过程中存放当前的组合路径vector<int> path;// 回溯函数,递归生成所有可能的组合void backtracking(int n, int k, int startindex) {// 如果当前路径的长度等于k,说明找到了一个长度为k的组合if (path.size() == k) {// 将当前路径加入到结果集中result.push_back(path);// 返回上一层递归return;}// 从startindex开始,尝试所有可能的下一个元素for (int i = startindex; i <= n; i++) {// 将当前元素加入到当前路径path.push_back(i);// 递归调用backtracking,注意下一次递归开始的索引是i+1,这样就不会有重复的组合backtracking(n, k, i + 1);// 将当前元素从路径中移除,也称为回溯path.pop_back();}// 如果循环结束,返回上一层递归return;}
};

在这个代码中:

  • 类Solution包含一个公共成员函数combine,它初始化回溯过程并返回结果。
  • backtracking是一个递归函数,用于执行回溯搜索。它接受当前数字的范围n,组合的长度k,以及当前搜索的起始索引startindex。
  • 私有成员result用于存储最终的组合结果;path用于在递归过程中跟踪当前的组合路径。
  • 在backtracking函数中,通过循环遍历startindex到n的所有数字,并将每个数字添加到当前路径path中。每添加一个数字,就递归调用backtracking,直到达到组合的长度k。到达长度k时,将当前路径path添加到结果列表result中。
  • 在每次递归调用之后,path需要回溯,即移除最后一个元素,以便下一次递归调用可以尝试新的数字组合。

这种方法能够避免重复的组合,因为每次递归都从下一个数字开始,而不是从头开始。这样就保证了每个数字只使用一次,同时也保证了组合是按顺序生成的。

组合问题的剪枝操作

详细解析可以看这篇文章:77.组合优化
在这里插入图片描述
代码如下:

// 定义Solution类,这是一个解决方案类
class Solution {
public:// combine函数用于获取所有可能的组合vector<vector<int>> combine(int n, int k) {// 从数字1开始递归回溯搜索backtracking(n, k, 1);// 返回最终的结果列表return result;}private:// result用于存储所有的组合vector<vector<int>> result;// path用于在递归中构建每个组合vector<int> path;// backtracking是核心的递归回溯函数void backtracking(int n, int k, int startindex) {// 如果当前路径中的数字数量已经达到k个,则将当前路径保存到结果列表中if (path.size() == k) {result.push_back(path);return;}// 进行循环,尝试所有可能的数// 注意:这里使用了优化,减少了搜索的范围,避免了不必要的递归// n - (k - path.size()) + 1是剪枝后的上界for (int i = startindex; i <= n - (k - path.size()) + 1; i++) {// 将当前数字i加入到当前组合路径中path.push_back(i);// 递归调用backtracking,进行下一层搜索,下一次搜索从i+1开始backtracking(n, k, i + 1);// 回溯,移除当前路径中的最后一个数字,回到上一步,尝试其它可能的数字path.pop_back();}// 当循环结束,返回上一层递归return;}
};

在这段代码中:

  • backtracking是一个递归函数,用于深入每一层搜索可能的组合。
  • path是一个临时向量,用于存储当前递归路径上的组合。
  • result是一个二维向量,用于存储所有有效的k个数的组合。
  • backtracking函数中的if语句是递归的终止条件,即当path的大小等于k时,将当前组合添加到结果中。
  • 循环中的i <= n - (k - path.size()) + 1是一个关键的优化,它保证了仅当还有足够的元素可供选择以填满剩余的位置时,循环才会继续。这样可以减少不必要的递归调用,提高算法的效率。

例如,如果n=4, k=2,并且目前path已经包含了一个元素(假设是1),则只需要在剩下的3个元素中选择一个(2, 3, 或4),而不需要再考虑选择1。如果当前path已经有两个元素,则循环不再进行,因为不需要更多元素。

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

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

相关文章

【重要公告】BSV区块链协会宣布将启动多项动态安全增强措施

​​发表时间&#xff1a;2024年2月16日 2024年2月16日&#xff0c;瑞士楚格 - BSV区块链协议的管理机构BSV区块链协会&#xff08;以下简称“BSV协会”&#xff09;宣布对其运营模式实施全新的安全架构&#xff0c;其中包括引入网络访问规则和数字资产找回协议&#xff0c;以及…

Matlab: Introduction to Hybrid Beamforming

文章目录 来源混合波束赋形的基本概念System Setup关键函数 来源 在matlab的命令行输入 doc hybrid beamforming 混合波束赋形的基本概念 混合波束形成简介 本例介绍了混合波束形成的基本概念&#xff0c;并说明了如何模拟这种系统。 现代无线通信系统使用空间复用来提高散…

ARM64汇编02 - 寄存器与指令基本格式

最近的文章可能会有较多修改&#xff0c;请关注博客哦 异常级别 ARMv8处理器支持4种异常等级&#xff08;Exception Level&#xff0c;EL&#xff09;。 EL0 为非特权模式&#xff0c;用于运行应用程序&#xff0c;其他资源访问受限&#xff0c;权限不够。 EL1 为特权模式&…

C++:常量表达式

C11开始constexpr作为一种声明&#xff0c;为编译器提供了在编译期间确认结果的优化建议&#xff0c;满足部分编译期特性的需求 constexpr和const区别 int b10; const int ab; //运行成功 constexpr int cb; //编译器报错&#xff0c;b的值在编译期间不能确定 const int size1…

电视盒子什么牌子好?老烧分享电视盒子品牌排行榜

多年前开始我就用电视盒子了至今已经七年&#xff0c;对各个品牌的电视盒子我都有详细深入的了解&#xff0c;看到网友们在讨论电视盒子什么牌子好&#xff0c;不知道如何挑选电视盒子的朋友们可以关注发烧友圈公认的电视盒子品牌排行榜&#xff0c;看看入围的都有哪些品牌吧。…

数据库之MVCC

1、什么是MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。MVCC使得大部分支持行锁的事务引擎&#xff0c;不再单纯的使用行锁来进行…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

小兴教你做平衡小车-stm32程序开发(串口打印)

文章目录 1 前言2 串口打印库函数版本3 串口打印寄存器版本3.1 配置时钟3.2 配置GPIO功能3.3 配置CR2寄存器3.4 配置CR1寄存器3.5 配置CR3寄存器 1 前言 我们在调试的过程中&#xff0c;都比较喜欢直观的数据&#xff0c;这时候我们可以使用芯片的串口功能&#xff0c;把数据打…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

智慧生活,从餐厅开始:开发智能扫码点餐系统的技术详解

本篇文章&#xff0c;小编将深入为大家讲解开发智能扫码点餐系统的技术细节&#xff0c;从系统架构到关键功能实现&#xff0c;为读者提供全面的技术指南。 一、智能扫码点餐系统概述 可实现在线浏览菜单、点餐、支付等操作&#xff0c;大大简化了点餐流程&#xff0c;提升了…

Spring Cloud Gateway官方文档学习

文章目录 推荐写在前面一、熟悉Gateway基本概念与原理1、三大概念2、工作流程 二、基本使用路由断言的两种写法 三、路由断言工厂1、After路由断言工厂2、Before路由断言工厂3、Between路由断言工厂4、Cookie路由断言工厂5、Header路由断言工厂6、Host路由断言工厂7、Method路由…

大话设计模式——4.装饰模式(Decorator Pattern)

1.定义 1&#xff09;可以在不改动原有对象代码的情况下扩展对象的功能&#xff0c;通过聚合的方式相较于继承更加灵活。 2&#xff09;UML图 2.示例 汽车有很多装饰可选&#xff0c;如座椅、音响、轮胎等都可以进行自定义组装 1&#xff09;抽象汽车对象 public interfac…

代码库管理工具Git介绍

阅读本文同时请参阅-----免费的Git图形界面工具sourceTree介绍 Git是一个分布式版本控制系统&#xff0c;它可以帮助开发者跟踪和管理代码历史。Git的命令行工具是使用Git的核心方式&#xff0c;虽然它可能看起来有些复杂&#xff0c;但是一旦掌握了基本命令&#xff0c;你…

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

【Unity】构建简单实用的年份选择器(简单原理示范)

在许多应用程序和游戏中&#xff0c;年份选择是一个常见的需求。无论是在日历应用程序中查看事件&#xff0c;还是在历史类游戏中选择时间段&#xff0c;年份选择器都是用户体验的重要组成部分&#xff0c;下面实现一个简易的年份选择器。 一、效果预览&#xff1a; 目录 一、…

为什么会出现 targetId 与 senderUserId 相同的情况?

描述 单聊会话&#xff08;两位用户聊天&#xff09;中出现了消息的 targetId 和 senderUserId 相同的情况。 分析 融云 IM 设计如此。 senderUserId 是消息的发送者的用户 ID。targetId 是当前会话的 ID&#xff0c;该 ID 指向与本端用户对话的用户 ID、群组 ID、聊天室 I…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数&#xff0c;当计数值达到设定要求时&#xff0c;向cpu提出中断处理请求&#xff0c;从而实现&#xff0c;定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ&#xff0c;…

Linux系统Docker部署StackEdit Markdown并实现公网访问本地编辑器

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

基于Redo log Undo log的MySQL的崩溃恢复

基于Redo log & Undo log的MySQL的崩溃恢复 Redo log Undo log Redo log 重做日志,记录,修改过的数据 Undo log 回滚日志,记录修改之前的数据 两个我不做详细的介绍了,redo log就是记录哪些地方被修改了 undo log是记录修改之前我们的数据长什么样 更新流程 我们来捋一…