当前位置: 首页 > news >正文

代码随想录算法训练营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. 组合

题目链接
文章讲解
视频讲解

在这里插入图片描述

思路:

  1. 递归函数的参数和返回值:参数:n,k,startIndex(每一层递归需要避开已经遍历过的数,所以需要一个索引去记录遍历到[1,n]的那个数字了)
  2. 终止条件:存下来的path大小已经满足k了
  3. 单层递归的逻辑:for循环遍历[1,n],添加单个数字到path中,再递归添加下一个数字(startIndex+1)。
  4. 剪枝:其实单层遍历的时候不需要遍历满[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。

思路:

  1. 递归函数参数以及返回值:参数:n,k,startIndex(每一层递归需要避开已经遍历过的数,所以需要一个索引去记录遍历到[1,n]的那个数字了)
  2. 终止条件:path大小满足k的时候终止,判断总和是否为n,是则加入结果集。
  3. 单层处理逻辑:for循环遍历[1,9],添加单个数字到path中,再递归添加下一个数字(startIndex+1)。
  4. 剪枝:跟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对应字符串。

递归思路:

  1. 递归函数参数以及返回值:参数:digits,Index(这个索引是告诉递归函数遍历到了digits的那个数字)
  2. 终止条件:当遍历完digits时终止,将目前存的string放入结果集。
  3. 单层处理逻辑: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天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#x…...

2024秋语法分析作业-B(满分25分)

特别注意&#xff1a;第17条产生式改为 17) Stmt → while ( Cond ) Stmt 【问题描述】 本次作业只测试一个含简单变量声明、赋值语句、输出语句、if语句和while语句的文法&#xff1a; 0) CompUnit → Block 1) Block → { BlockItemList } 2) BlockItemList → BlockItem…...

Python爬虫入门(1)

在互联网时代&#xff0c;数据成为了最宝贵的资源之一。Python作为一种功能强大的编程语言&#xff0c;因其简洁的语法和丰富的库支持&#xff0c;成为了编写网络爬虫的首选。本文将带你入门Python爬虫技术&#xff0c;让你能够从互联网上自动获取数据。 什么是爬虫&#xff1…...

鸿蒙1.2:第一个应用

1、create Project&#xff0c;选择Empty Activity 2、配置项目 project name 为项目名称&#xff0c;建议使用驼峰型命名 Bundle name 为项目包名 Save location 为保存位置 Module name 为模块名称&#xff0c;即运行时需要选择的模块名称&#xff0c;见下图 查看模块名称&…...

2024年常用工具

作为本年度高频使用工具&#xff0c;手机端也好&#xff0c;桌面端也好&#xff0c;筛选出来9款产品&#xff0c;这里也分享给关注我的小伙伴 &#xff0c;希望对你有些帮助&#xff0c;如果你更好的产品推荐&#xff0c;欢迎留言给我。 即刻 产品经理的聚集地&#xff0c;“让…...

【蓝桥杯】走迷宫

题目&#xff1a; 解题思路&#xff1a; 简单的广度优先算法&#xff08;BFS&#xff09; BFS 的特性 按层次遍历&#xff1a;BFS 按照节点的距离&#xff08;边的数量&#xff09;来逐层访问节点。保证最短路径&#xff1a;对于无权图&#xff08;所有边权重相同&#xff0…...

【pyqt】(三)designer

designer ui设计 在学习后续的代码之前&#xff0c;我们可以先学习一下designer这款工具&#xff0c;在安装软件的时候我们有提到过&#xff0c;其具体位置在虚拟环境根目录下的\Lib\site-packages\PySide6文件夹中。对于新手而言&#xff0c;使用这种可视化的工具可以帮助我们…...

【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 类方法练习&#xff1a;二维矢量模拟玩家移动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 百度&#xff1a;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?&#xff08;靶机开了几个TCP端口&#xff09; 2What is the domain of the email address provided in the “Contact” section of the website?&#xff08;网站的“CONTACT”部分提供的电子邮件地址的域是什么&#xff1f;&#xff09…...

【Python其他生成随机字符串的方法】

在Python中&#xff0c;除了之前提到的方法外&#xff0c;确实还存在其他几种生成随机字符串的途径。以下是对这些方法的详细归纳&#xff1a; 方法一&#xff1a;使用random.randint结合ASCII码生成 你可以利用random.randint函数生成指定范围内的随机整数&#xff0c;这些整…...

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 应用程序配置和部署的框架。它提供了一种快速开发的方式&#xff0c;通过默认配置、自动化配置等特性&#xff0c;使得开发者能够更快捷地构建和部署基于 Spring 的应用。 Spring Boot Web 是 Spring Boot 的一个子模块&#xff0c;它专注于…...

【C】​动态内存管理

所谓动态内存管理&#xff0c;就是使得内存可以动态开辟&#xff0c;想使用的时候就开辟空间&#xff0c;使用完之后可以销毁&#xff0c;将内存的使用权还给操作系统&#xff0c;那么动态开辟内存有什么用呢&#xff1f; 假设有这么一种情况&#xff0c;你在一家公司中工作&am…...

lec5-传输层原理与技术

lec5-传输层原理与技术 1. 传输层概述 1.1. 关键职责 flow control&#xff0c;流量控制reliability&#xff0c;可靠性 1.2. TCP与UDP对比 面向连接 / 不能连接对数据校验 / 不校验数据丢失重传 / 不会重传有确认机制 / 没有确认滑动窗口流量控制 / 不会流量控制 1.3. 关…...

【C语言】_指针运算

目录 1. 指针-整数 2. 指针-指针 2.1 指针-指针含义 2.2 指针-指针运算应用&#xff1a;实现my_strlen函数 3. 指针的关系运算&#xff08;大小比较&#xff09; 1. 指针-整数 联系关于指针变量类型关于指针类型和指针-整数相关知识&#xff1a; 原文链接如下&#xff1…...

“AI智慧教学系统:开启个性化教育新时代

大家好&#xff0c;我是老王&#xff0c;一个在产品圈摸爬滚打多年的资深产品经理。今天&#xff0c;我想和大家聊聊一个最近特别火的概念——AI智慧教学系统。这东西听起来好像很高大上&#xff0c;但其实和我们每个人都息息相关&#xff0c;因为它关系到我们下一代的教育。 一…...

商用车自动驾驶,迎来大规模量产「临界点」?

商用车自动驾驶&#xff0c;正迎来新的行业拐点。 今年初&#xff0c;交通部公开发布AEB系统运营车辆标配征求意见稿&#xff0c;首次将法规限制条件全面放开&#xff0c;有望推动商用车AEB全面标配&#xff0c;为开放场景的商用车智能驾驶市场加了一把火。 另外&#xff0c;…...

CSS 学习之正确看待 CSS 世界里的 margin 合并

一、什么是 margin 合并 块级元素的上外边距(margin-top)与下外边距(margin-bottom)有时会合并为单个外边距&#xff0c;这样的现象称为“margin 合并”。从此定义上&#xff0c;我们可以捕获两点重要的信息。 块级元素&#xff0c;但不包括浮动和绝对定位元素&#xff0c;尽…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...