力扣日记1.21-【回溯算法篇】77. 组合

力扣日记:【回溯算法篇】77. 组合

日期:2023.1.21
参考:代码随想录、力扣
终于结束二叉树了!听说回溯篇也是个大头,不知道这一篇得持续多久了……

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

题解

class Solution {
#define SOLUTION 2
public:
#if SOLUTION == 1// 定义两个全局变量vector<vector<int>> result; // 存放结果集vector<int> path;   // 存放当前组合// 转换为树结构,树的宽度为当前集合长度(用for循环横向遍历),树的深度为递归层数(组合个数k)vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}// 回溯三部曲// 1. 返回值为void,参数为原参数n、k以及表示当前集合开始遍历的起始位置void backtracking(int n, int k, int startindex) {// 2. 终止条件if (path.size() == k) { // 当前组合(大小)已满足条件// 存放结果result.push_back(path);return;}// 3. 回溯逻辑// for 循环横向遍历当前集合for (int i = startindex; i <= n; i++) { // index:[1, n]// 处理节点path.push_back(i);// 递归backtracking(n, k, i+1);    // 下一次从i+1开始遍历// 回溯,撤销处理节点path.pop_back();}}
#elif SOLUTION == 2 // 考虑剪枝优化// 剪枝优化主要体现在 for 循环横向遍历处// 如果剩余可遍历(取值)的元素数量不足以达到组合长度,则没有必要遍历// 即当前路径长度 path.size() + x >= k, 其中x为剩余可遍历的元素个数 x = n - startindex + 1(加1因为是左闭)// 所以startindex(即for中的i) 需 <= path.size() + n + 1 - k// 定义两个全局变量vector<vector<int>> result; // 存放结果集vector<int> path;   // 存放当前组合// 转换为树结构,树的宽度为当前集合长度(用for循环横向遍历),树的深度为递归层数(组合个数k)vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}// 回溯三部曲// 1. 返回值为void,参数为原参数n、k以及表示当前集合开始遍历的起始位置void backtracking(int n, int k, int startindex) {// 2. 终止条件if (path.size() == k) { // 当前组合(大小)已满足条件// 存放结果result.push_back(path);return;}// 3. 回溯逻辑// for 循环横向遍历当前集合for (int i = startindex; i <= path.size() + n + 1 - k; i++) { // 剪枝优化// 处理节点path.push_back(i);// 递归backtracking(n, k, i+1);    // 下一次从i+1开始遍历// 回溯,撤销处理节点path.pop_back();}}
#endif
};

复杂度

时间复杂度:
空间复杂度:

思路总结

  • 回溯算法理论基础
  • 回溯算法模板框架:
    void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
    }			
    
  • 将组合问题抽象为树形结构(N叉树):
    在这里插入图片描述

    每个框即为每层递归的for循环,取值即为处理节点,最下面即为达到组合长度(终止条件)后存放结果

  • 回溯法三部曲:
    • 递归函数的返回值以及参数:
      • 为了简化参数,分别为存放整体结果集和单一组合定义两个全局变量,resultpath
      • 返回值一定为void,传递参数除了原始参数n和k,还要加一个startindex,用来记录本层递归的中,集合从哪里开始遍历
    • 终止条件:当前组合(大小)已满足条件
      • 此时将组合保存进结果集
    • 单层搜索的过程:
      • for 循环横向遍历当前集合(从startindex开始遍历):
        • 首先处理节点(即将当前值放入path)
        • 接着进行递归(起始位置要+1)
        • 再是回溯(即撤销处理节点,将值弹出)
  • 关于剪枝优化:
    • 剪枝优化主要体现在 for 循环横向遍历处:

      • 如果剩余可遍历(取值)的元素数量不足以达到组合长度,则没有必要继续遍历
      • 即当前路径长度 path.size() + x >= k, 其中x为剩余可遍历的元素个数 x = n - startindex + 1(加1因为是左闭)
      • 所以startindex(即for中的i) 需 <= path.size() + n + 1 - k
    • 在这里插入图片描述

    • 对于原来的不剪枝的情况,会在遍历到叶子节点(即for循环遍历完后)结束当前层递归,但由于未达到组合长度,所以在递归中不会添加到结果集。

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

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

相关文章

LSTM时间序列预测

本文借鉴了数学建模清风老师的课件与思路&#xff0c;可以点击查看链接查看清风老师视频讲解&#xff1a;【1】演示&#xff1a;基于LSTM深度学习网络预测时间序列&#xff08;MATLAB工具箱&#xff09;_哔哩哔哩_bilibili % Forecast of time series based on LSTM deep learn…

敏捷测试和DevOpes自动化测试的区别

敏捷测试和DevOps自动化测试在以下方面存在区别&#x1f447; 1️⃣目标 &#x1f388;敏捷测试的主要目标是提供快速的反馈和持续的改进&#xff0c;以便在开发过程中尽早发现和解决问题&#xff0c;从而提高软件的质量和可靠性。 &#x1f308;DevOps自动化测试的目标是提高软…

Java学习笔记(七)——操作数组工具类Arrays

文章目录 ArraysArrays.toString()Arrays.binarySearch()Arrays.copyOf()Arrays.copyOfRange()Arrays.fill()Arrays.sort()升序排序降序排序 Arrays 操作数组的工具类。 Arrays.toString() import java.util.Arrays;public class test40 {public static void main(String[] a…

【Docker篇】详细讲解容器相关命令

&#x1f38a;专栏【Docker】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f6f8;容器&#x1f339;相关命令&#x1f354;案例⭐创建并运…

第四课:GPT2

文章目录 第四课&#xff1a;GPT21、学习总结&#xff1a;GPT2的学习目标和概念任务调节零样本学习和零短任务迁移 模型结构GPT-2 自注意力掩码实现1- 创建qkv2- 评分3- 合并注意力头4- Projecting 课程ppt及代码地址 2、学习心得&#xff1a;3、经验分享&#xff1a;4、课程反…

AWS 专题学习 P8 (ECS、EKS、Lambda、CloudFront、DynamoDB)

文章目录 什么是 Docker&#xff1f;操作系统上的 DockerDocker 镜像存储Docker vs. Virtual MachinesDocker 入门AWS 中的 Docker Containers Management Amazon ECSEC2 Launch TypeFargate Launch TypeECS 的 IAM RolesLoad Balancer IntegrationsData Volumes (EFS)ECS Serv…

Object.prototype.toString.call个人理解

文章目录 这段代码的常见用处参考文献&#xff1a; 拆分理解1、Object.prototype.toString小问题参考文献&#xff1a; 2、call函数的作用参考文献 3、继续深入一些&#xff08;这部分内容是个人理解&#xff0c;没有明确文献支撑&#xff09; 这段代码的常见用处 Object.prot…

easy Exsel导出

目录 一、首先引入依赖 二、然后封装一个VO 三、Controller层 四、Service实现类 引用样式 自适应列宽 自适应行高 五、测试 postman ​编辑 浏览器 异常 分配到这个任务了&#xff0c;写个小demo记录下&#xff0c;具体可参考EasyExcel官方文档 我用的是web上传…

CCC数字钥匙设计【NFC基础】--LPCD相关介绍

关于NFC卡检测&#xff0c;主要可以分成两个步骤&#xff1a; 1、LPCD低功耗检测&#xff0c;唤醒NFC读卡器。 2、唤醒后&#xff0c;NFC读卡器或MCU控制器轮询Type A、Type B、Type F、Type V&#xff08;ISO15693&#xff09;等卡类型。 本文主要介绍LPCD相关功能&#xff…

设备管理——WinCC 给你神助功

要实现“设备高效”&#xff0c;就必须“管之有道”&#xff0c;来自设备层的数据支撑将是必不可少的&#xff0c;提高设备效能的2个关键在于降低平时停机时间 (MDT) 和提高平均无故障时间 (MTBF)。通常来说&#xff0c;设备维护可大致可分为三个层次&#xff1a;纠正性维护&am…

c++ mysql数据库编程(linux系统)

ubuntu下mysql数据库的安装 ubuntu安装mysql&#xff08;图文详解&#xff09;-CSDN博客https://blog.csdn.net/qq_58158950/article/details/135667062?spm1001.2014.3001.5501 项目目录结构 数据库及表结构 public.h //打印错误信息 #ifndef PUBLIC_h #define PUBLIC_H…

【详解】通讯录项目

目录 通讯录项目要求&#xff1a; 引言&#xff1a; 步骤如下&#xff1a; 用户的数据类型&#xff1a; 初始化循序表&#xff1a; 菜单&#xff1a; 添加联系人&#xff1a; 删除联系人&#xff1a; 修改联系人&#xff1a; 查找联系人&#xff1a; 查看通讯录&…

《WebKit 技术内幕》之七(1): 渲染基础

《WebKit 技术内幕》之七&#xff08;1&#xff09;&#xff1a; 渲染基础 WebKit的布局计算使用 RenderObject 树并保存计算结果到 RenderObject 树。 RenderObject 树同其他树&#xff08;如 RenderLayer 树等&#xff09;&#xff0c;构成了 WebKit 渲染的为要基础设施。 1…

【RT-DETR有效改进】Google | EfficientNetV1一种超轻量又高效的网络 (附代码 + 添加教程)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…

python算法与数据结构---排序和归并排序

学习目标 掌握归并排序的基本原理使用python语言解答归并排序题目 归并排序 原理及过程 将两个有序的数组合并成一个有序数组称为从上往下分解&#xff1a;把当前区间一分为二&#xff0c;直至分解为若干个长度为1的子数组从上往下的合并&#xff1a;两个有序的子区域两两向…

Pytest 测试框架与Allure 测试报告——Allure2测试报告-L1

目录&#xff1a; allure2安装 Allure2介绍Allure2报告展示Allure2报告展示-首页概览Allure2报告展示-用例详情页Allure2安装Allure2下载与安装Allure环境验证插件安装-Python插件安装-Java验证插件安装-Javaallure2运行方式 生成测试报告流程使用Allure2运行方式-Python使用A…

大模型关键技术:上下文学习、思维链、RLHF、参数微调、并行训练、旋转位置编码、模型加速、大模型注意力机制优化、永久记忆、LangChain、知识图谱、多模态

大模型关键技术 大模型综述上下文学习思维链 CoT奖励建模参数微调并行训练模型加速永久记忆&#xff1a;大模型遗忘LangChain知识图谱多模态大模型系统优化AI 绘图幻觉问题从 GPT1 - GPT4 拆解GPTs 对比主流大模型技术点旋转位置编码层归一化激活函数注意力机制优化 大模型综述…

四种方法将 Docker Registry 迁移至 Harbor

Registry Docker Distribution Docker Distribution 是第一个是实现了打包、发布、存储和镜像分发的工具&#xff0c;起到 docker registry 的作用。&#xff08;目前 Distribution 已经捐赠给了 CNCF&#xff09;。其中 Docker Distribution 中的 spec 规范后来也就成为了 O…

Semaphone应用源码分析

Semaphone应用&源码分析 3.1 Semaphore介绍 sync&#xff0c;ReentrantLock是互斥锁&#xff0c;保证一个资源同一时间只允许被一个线程访问 Semaphore&#xff08;信号量&#xff09;保证1个或多个资源可以被指定数量的线程同时访问 底层实现是基于AQS去做的。 Semap…

开源进程/任务管理服务Meproc使用之HTTP API

本文讲述如何使用开源进程/任务管理服务Meproc的HTTP API管理整个服务。 Meproc所提供的全部 API 的 URL 都是相同的。 http://ip:port/proc例如 http://127.0.0.1:8606/proc在下面的小节中&#xff0c;我们使用curl命令向您展示 API 的方法、参数和请求正文。 启动任务 …