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.mzph.cn/news/707217.shtml

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

相关文章

ArcgisForJS如何将ArcGIS Server发布的点要素渲染为热力图?

文章目录 0.引言1.ArcGIS创建点要素2.ArcGIS Server发布点要素3.ArcgisForJS将ArcGIS创建的点要素渲染为热力图 0.引言 ArcGIS For JS 是一个强大的地理信息系统&#xff08;GIS&#xff09;工具&#xff0c;它允许开发者使用 JavaScript 语言来创建各种 GIS 应用。ArcGIS Ser…

DolphinScheduler——介绍及架构设计

目录 一、DolphinScheduler介绍 1.1 概述 1.2 特性 1.2.1 简单易用 1.2.2 丰富的使用场景 1.2.3 High Reliability 1.2.4 High Scalability 1.3 名词解释 1.3.1 名词解释 1.3.2 模块介绍 二、DolphinScheduler架构原理 2.1 系统架构图 2.2 架构说明 2.2.1 Maste…

音频混音算法的实现

最近项目有用到混音算法&#xff0c;这里用比较常见的一种&#xff0c;就是简单的加和之后做一下归一化。 是参考这个博主实现的&#xff1a; 音频混音的算法实现 下面直接贴代码&#xff1a; #include <stdio.h> #include <stdlib.h> #include <math.h&…

Python学习 day05(异常、模块导入)

异常 为什么要捕获异常 当程序遇到了BUG&#xff0c;如果不对BUG进行手动捕获&#xff0c;那么整个程序就会因为一个BUG而停止运行&#xff0c;这在有些情况下是会造成很大的损失&#xff0c;但是如果我们进行了手动捕获&#xff0c;那么整个程序会继续运行捕获异常的作用在于&…

vue-router4 (六) 命名视图

命名视图可以使得同一级&#xff08;同一个组件&#xff09;中展示更多的路由视图&#xff0c;而不是嵌套显示&#xff0c; 命名视图可以让一个组件中具有多个路由渲染出口&#xff0c;这对于一些特定的布局组件非常有用。 应用场景&#xff1a; 比如点击login切换到组件A&am…

vue3第三节(v-model 执行原理)

特殊说明&#xff1a; 以下vue3语法是基于 3.4之前版本进行使用的&#xff0c;3.4之后的版本 引入了 defineModel 宏&#xff0c;后续会介绍defineModel 1、vue3 与vue2 中v-model区别 vue3 中v-model绑定的不再是value&#xff0c;而是modelValue&#xff0c;接收的方法也不再…

2024-02-28(Kafka,Oozie,Flink)

1.Kafka的数据存储形式 一个主题由多个分区组成 一个分区由多个segment段组成 一个segment段由多个文件组成&#xff08;log&#xff0c;index&#xff08;稀疏索引&#xff09;&#xff0c;timeindex&#xff08;根据时间做的索引&#xff09;&#xff09; 2.读数据的流程 …

论文精读--GPT3

不像GPT2一样追求zero-shot&#xff0c;而换成了few-shot Abstract Recent work has demonstrated substantial gains on many NLP tasks and benchmarks by pre-training on a large corpus of text followed by fine-tuning on a specific task. While typically task-agnos…

Day04:APP架构小程序H5+Vue语言Web封装原生开发Flutter

目录 常见APP开发架构 APP-开发架构-原生态-IDEA APP-开发架构-Web封装-平台 APP-开发架构-H5&Vue-HBuilderX WX小程序-开发架构-Web封装-平台 WX小程序-开发架构-H5&Vue-HBuilderX 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服…

Leetcode—82. 删除排序链表中的重复元素 II【中等】

2024每日刷题&#xff08;117&#xff09; Leetcode—82. 删除排序链表中的重复元素 II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val…

在Golang中简化日志记录:提升性能和调试效率

最大化效率和有效故障排除&#xff1a;在Golang中简化日志记录 日志记录是软件开发的一个基本方面&#xff0c;有助于调试、监控和理解应用程序的流程。在Golang中&#xff0c;有效的日志记录实践可以显著提高性能并简化调试过程。本文探讨了优化Golang日志记录的技术&#xf…

服务器数据恢复-异常断电导致服务器硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; dell某型号服务器中有一组通过raid卡组建的raid10&#xff0c;该raid阵列中一共有4块磁盘。上层部署XenServer虚拟化平台&#xff0c;作为网站服务器使用。 服务器故障&#xff1a; 服务器异常断电导致服务器上的一台虚拟机不可用。需要恢复这…

Java Web(八)--Servlet(二)

Servlet API Servlet API 包含以下4个Java包&#xff1a; 1. javax.servlet&#xff1a;其中包含定义Servlet和Servlet容器之间契约的类和接口。 2. javax.servlet.http&#xff1a;主要定义了与HTTP协议相关的HttpServlet类&#xff0c;HttpServletRequest接口和HttpServl…

C语言第三十二弹---自定义类型:联合和枚举

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、联合体 1.1、联合体类型的声明 1.2、联合体的特点 1.3、相同成员的结构体和联合体对比 1.4、联合体大小的计算 1.5、联合的⼀个练习 2、枚举类型 …

网络初识(概念入门)

目录 1.局域网VS广域网 1.1局域网 1.2广域网 2.五元组 2.1 IP和端口 2.1.1 IP 2.1.2端口号 2.2协议 3.协议分层 4. TCP/IP五层模型 5.封装和分用 5.1封装 5.2分用 1.局域网VS广域网 1.1局域网 简单介绍&#xff1a;指在某一特定区域内由多台计算机组成的互联网组…

springboot-基础-添加model和controller的简单例子+常用注解含义

备份笔记。所有代码都是2019年测试通过的&#xff0c;如有问题请自行搜索解决&#xff01; 上一篇&#xff1a;springboot-基础-eclipse配置helloword示例 目录 添加model和controller的例子注解开发使用RestController 大坑 Model ModelMap和ModelAndView的区别 添加model和c…

only office-用着确实很省心

小程一言 最近一直在使用各种办公软件进行学习笔记整理&#xff0c;但是在使用过程中&#xff0c;总感觉不是自己想要的一款软件&#xff0c;想要一款真正懂自己的软件&#xff0c;是一个选择的过程。最近在网上闲逛发现一款宝藏软件&#xff0c;好奇心驱使我去进行适用&#…

Apache POl

介绍 Apache POl是一个处理Miscrosoft Ofice各种文件格式的开源项目。简单来说就是&#xff0c;我们可以使用 POI 在 Java 程序中对Miscrosoft Office各种文件进行读写操作,一般情况下&#xff0c;POI都是用于操作 Excel 文件。 Apache POl 的应用场景 1.银行网银系统导出交易…

VScode打开keil5软件的内容

VScode想要打开keil5软件的内容&#xff0c;需要在此引入 具体可参考&#xff1a; VS Code环境下编辑、编译、下载Keil工程代码

《大模型时代-ChatGPT开启通用人工智能浪潮》精华摘抄

原书很长&#xff0c;有19.3w字&#xff0c;本文尝试浓缩一下其中的精华。 知识点 GPT相关 谷歌发布LaMDA、BERT和PaLM-E&#xff0c;PaLM 2 Facebook的母公司Meta推出LLaMA&#xff0c;并在博客上免费公开LLM&#xff1a;OPT-175B。 在GPT中&#xff0c;P代表经过预训练(…