代码随想录算法训练营day22
代码随想录算法训练营
—day22
文章目录
- 代码随想录算法训练营
- 前言
- 回溯算法理论基础
- 回溯法解决的问题
- 回溯法模板
- 一、77. 组合
- 二、216. 组合总和 III
- 三、17. 电话号码的字母组合
- 总结
前言
今天是算法营的第22天,希望自己能够坚持下来!
今日任务:
● 回溯算法理论基础
● 77. 组合
● 216.组合总和III
● 17.电话号码的字母组合
回溯算法理论基础
文章讲解

- 回溯法也可以叫做回溯搜索法,它是一种搜索的方式。
- 回溯是递归的副产品,只要有递归就会有回溯。
- 回溯的本质是穷举,是一种纯暴力的方法,嵌套多个for循环 回溯法解决的问题都可以抽象为树形结构
- 回溯的递归函数一般叫backtracking,返回值一般为void,参数比较多,没那么容易确定下来,所以一般是先写逻辑,然后需要什么参数,就填什么参数。
回溯法解决的问题
- 组合问题:N个数里面按一定规则找出k个数的集合
- 切割问题:一个字符串按一定规则有几种切割方式
- 子集问题:一个N个数的集合里有多少符合条件的子集
- 排列问题:N个数按一定规则全排列,有几种排列方式
- 棋盘问题:N皇后,解数独等等
回溯法模板
void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}
一、77. 组合
题目链接
文章讲解
视频讲解

思路:
- 递归函数的参数和返回值:参数:n,k,startIndex(每一层递归需要避开已经遍历过的数,所以需要一个索引去记录遍历到[1,n]的那个数字了)
- 终止条件:存下来的path大小已经满足k了
- 单层递归的逻辑:for循环遍历[1,n],添加单个数字到path中,再递归添加下一个数字(startIndex+1)。
- 剪枝:其实单层遍历的时候不需要遍历满[1,n],当遍历到剩下的数字个数已经不足以组成k个的时候已经不需要再遍历了,所以在for循环中,使用i < n - (k - 目前存的个数) + 1,这里+1是因为范围包含了startIndex
class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking(int n, int k, int startIndex) {//当组合大小满足k时放入结果集if (path.size() == k) {result.push_back(path);return;}//遍历[1,n]依次寻找结果集, 遍历到剩余元素个数不足以满足k的时候就可以停了for (int i = startIndex; i <= n - (k - path.size()) + 1; i ++) {path.push_back(i); //放入ibacktracking(n, k, i + 1); //寻找跟i能满足k的组合,并且传入遍历的起始下标path.pop_back(); //取出i}return;}vector<vector<int>> combine(int n, int k) {backtracking(n, k, 1);return result;}
};
二、216. 组合总和 III
题目链接
文章讲解
视频讲解
跟77. 组合 其实就是多了个和的约束,思路是差不多的。并且要注意题目说只用数字1到9。
思路:
- 递归函数参数以及返回值:参数:n,k,startIndex(每一层递归需要避开已经遍历过的数,所以需要一个索引去记录遍历到[1,n]的那个数字了)
- 终止条件:path大小满足k的时候终止,判断总和是否为n,是则加入结果集。
- 单层处理逻辑:for循环遍历[1,9],添加单个数字到path中,再递归添加下一个数字(startIndex+1)。
- 剪枝:跟77. 组合 一样,for循环中只需要到i < n - (k - 目前存的个数) + 1,并且总和大于n了也可以直接返回,不需要再遍历了。
代码如下:
class Solution {
public:vector<int> path;vector<vector<int>> result;void backtracking (int k, int n, int sum, int startIndex) {if (sum > n) return; //剪枝,超过目标总和了直接返回if (path.size() == k) { //组合大小满足的就要返回,没必要继续下去了if (sum == n) result.push_back(path); //组合大小满足,总和也满足才加入结果集return;}//遍历[1,n]依次寻找结果集, 遍历到剩余元素个数不足以满足k的时候就可以停了,题目要求只使用数字19for (int i = startIndex; i <= 9 - (k - path.size()) + 1; i ++) {sum += i;path.push_back(i);backtracking(k, n, sum, i + 1);//寻找跟i能满足k的组合,并且传入遍历的起始下标和目前的总和path.pop_back();sum -= i;}return;}vector<vector<int>> combinationSum3(int k, int n) {backtracking(k, n, 0, 1);return result;}
};
三、17. 电话号码的字母组合
题目链接
文章讲解
视频讲解
思路:
需要有一个数组来存下每个数字对应的字母,用一个string[],用下标对应数字,string对应字符串。
递归思路:
- 递归函数参数以及返回值:参数:digits,Index(这个索引是告诉递归函数遍历到了digits的那个数字)
- 终止条件:当遍历完digits时终止,将目前存的string放入结果集。
- 单层处理逻辑:for循环遍历digits[Index]对应的字符串,添加单个字母到string中,再递归添加下一个数字对应的字母(index+1)。
class Solution {
private:const string letterMap[10] = {"", //0"", //1"abc",//2"def",//3"ghi",//4"jkl",//5"mno",//6"pqrs",//7"tuv",//8"wxyz"//9};public:vector<string> result; //结果集string s; //单个结果void backtracking (string &digits, int index) {if (index == digits.size()) { //当遍历完digits字母时终止并保存结果result.push_back(s);return;}int digit = digits[index] - '0'; //将index指向的数字转为intstring letters = letterMap[digit]; //取出数字对应的字母集for (int i = 0; i < letters.size(); i++) { //遍历子母集获取字母组合s.push_back(letters[i]);backtracking(digits, index + 1); //递归,index+1因为下一层是处理digits的下一个字母了s.pop_back(); //回溯}}vector<string> letterCombinations(string digits) {s.clear();result.clear();if (digits.size() == 0) return result;backtracking(digits, 0);return result;}
};
总结
今天主要学习了回溯算法的理论和其中解决组合类的题目。
- 回溯算法是一种纯暴力的方法,嵌套多个for循环
- 回溯法解决的问题都可以抽象为树形结构
- 组合类的题目需要使用一个索引去告诉函数遍历到哪里了
明天继续加油!
相关文章:
代码随想录算法训练营day22
代码随想录算法训练营 —day22 文章目录 代码随想录算法训练营前言回溯算法理论基础回溯法解决的问题回溯法模板 一、77. 组合二、216. 组合总和 III三、17. 电话号码的字母组合总结 前言 今天是算法营的第22天,希望自己能够坚持下来! 今日任务&#x…...
2024秋语法分析作业-B(满分25分)
特别注意:第17条产生式改为 17) Stmt → while ( Cond ) Stmt 【问题描述】 本次作业只测试一个含简单变量声明、赋值语句、输出语句、if语句和while语句的文法: 0) CompUnit → Block 1) Block → { BlockItemList } 2) BlockItemList → BlockItem…...
Python爬虫入门(1)
在互联网时代,数据成为了最宝贵的资源之一。Python作为一种功能强大的编程语言,因其简洁的语法和丰富的库支持,成为了编写网络爬虫的首选。本文将带你入门Python爬虫技术,让你能够从互联网上自动获取数据。 什么是爬虫࿱…...
鸿蒙1.2:第一个应用
1、create Project,选择Empty Activity 2、配置项目 project name 为项目名称,建议使用驼峰型命名 Bundle name 为项目包名 Save location 为保存位置 Module name 为模块名称,即运行时需要选择的模块名称,见下图 查看模块名称&…...
2024年常用工具
作为本年度高频使用工具,手机端也好,桌面端也好,筛选出来9款产品,这里也分享给关注我的小伙伴 ,希望对你有些帮助,如果你更好的产品推荐,欢迎留言给我。 即刻 产品经理的聚集地,“让…...
【蓝桥杯】走迷宫
题目: 解题思路: 简单的广度优先算法(BFS) BFS 的特性 按层次遍历:BFS 按照节点的距离(边的数量)来逐层访问节点。保证最短路径:对于无权图(所有边权重相同࿰…...
【pyqt】(三)designer
designer ui设计 在学习后续的代码之前,我们可以先学习一下designer这款工具,在安装软件的时候我们有提到过,其具体位置在虚拟环境根目录下的\Lib\site-packages\PySide6文件夹中。对于新手而言,使用这种可视化的工具可以帮助我们…...
【Go学习】-01-3-函数 结构体 接口 IO
【Go学习】-01-3-函数 结构体 接口 IO 1 函数1.1 函数概述1.1.1 函数做为参数1.1.2 函数返回值 1.2 参数1.3 匿名函数1.4 闭包1.5 延迟调用1.6 异常处理 2 结构体2.1 实例化2.2 匿名结构体2.3 匿名字段 3 类方法3.1 接收器3.2 类方法练习:二维矢量模拟玩家移动3.3 给…...
昆仑万维大数据面试题及参考答案
请介绍一下 Flume 组件。 Flume 是一个分布式、可靠、高可用的海量日志采集、聚合和传输的系统。 从架构层面来看,它主要包含以下几个关键部分。首先是 Source,它是数据的收集端,能够接收多种不同来源的数据。比如,它可以从各种服务器的日志文件中读取数据,像 Web 服务器产…...
20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World
20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World 2025/1/3 14:06 百度:android studio helloworld android studio hello world kotlin helloword kotlin 串口 no run configurations added android studio no run configurations added 1、…...
Hack The Box-Starting Point系列Three
答案 How many TCP ports are open?(靶机开了几个TCP端口) 2What is the domain of the email address provided in the “Contact” section of the website?(网站的“CONTACT”部分提供的电子邮件地址的域是什么?)…...
【Python其他生成随机字符串的方法】
在Python中,除了之前提到的方法外,确实还存在其他几种生成随机字符串的途径。以下是对这些方法的详细归纳: 方法一:使用random.randint结合ASCII码生成 你可以利用random.randint函数生成指定范围内的随机整数,这些整…...
redis7基础篇2 redis的主从模式1
目录 一 主从模式 1.1 主从复制的作用 1.2 配置常用命令 1.3 主从复制常见问题 1.4 主从复制的缺点 1.5 redis主从复制原理 二 redis主从复制的搭建流程 2.1 注意事项 2.2 redis的主从复制架构图 2.3 以6379.conf配置文件配置为例 2.4 以6380.conf配置文件配置为例 …...
Springboot - Web
Spring Boot 是一个用于简化 Spring 应用程序配置和部署的框架。它提供了一种快速开发的方式,通过默认配置、自动化配置等特性,使得开发者能够更快捷地构建和部署基于 Spring 的应用。 Spring Boot Web 是 Spring Boot 的一个子模块,它专注于…...
【C】动态内存管理
所谓动态内存管理,就是使得内存可以动态开辟,想使用的时候就开辟空间,使用完之后可以销毁,将内存的使用权还给操作系统,那么动态开辟内存有什么用呢? 假设有这么一种情况,你在一家公司中工作&am…...
lec5-传输层原理与技术
lec5-传输层原理与技术 1. 传输层概述 1.1. 关键职责 flow control,流量控制reliability,可靠性 1.2. TCP与UDP对比 面向连接 / 不能连接对数据校验 / 不校验数据丢失重传 / 不会重传有确认机制 / 没有确认滑动窗口流量控制 / 不会流量控制 1.3. 关…...
【C语言】_指针运算
目录 1. 指针-整数 2. 指针-指针 2.1 指针-指针含义 2.2 指针-指针运算应用:实现my_strlen函数 3. 指针的关系运算(大小比较) 1. 指针-整数 联系关于指针变量类型关于指针类型和指针-整数相关知识: 原文链接如下࿱…...
“AI智慧教学系统:开启个性化教育新时代
大家好,我是老王,一个在产品圈摸爬滚打多年的资深产品经理。今天,我想和大家聊聊一个最近特别火的概念——AI智慧教学系统。这东西听起来好像很高大上,但其实和我们每个人都息息相关,因为它关系到我们下一代的教育。 一…...
商用车自动驾驶,迎来大规模量产「临界点」?
商用车自动驾驶,正迎来新的行业拐点。 今年初,交通部公开发布AEB系统运营车辆标配征求意见稿,首次将法规限制条件全面放开,有望推动商用车AEB全面标配,为开放场景的商用车智能驾驶市场加了一把火。 另外,…...
CSS 学习之正确看待 CSS 世界里的 margin 合并
一、什么是 margin 合并 块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距,这样的现象称为“margin 合并”。从此定义上,我们可以捕获两点重要的信息。 块级元素,但不包括浮动和绝对定位元素,尽…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
