[算法训练营] 回溯算法专题(二)

🕺作者: 主页

我的专栏
C语言从0到1
探秘C++
数据结构从0到1
探秘Linux
菜鸟刷题集

😘欢迎关注:👍点赞🙌收藏✍️留言

🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!

文章目录

    • 前言
    • 93. 复原 IP 地址
      • 解题思路
      • AC代码
    • 78. 子集
      • 解题思路
      • AC代码
    • 90. 子集 II
      • 解题思路
      • AC代码
    • 491. 递增子序列
      • 解题思路
      • AC代码
    • 46. 全排列
      • 解题思路
      • AC代码

前言

本篇共5题,附有解题思路和AC代码。

边听歌边刷起来吧~

🎸Make Believe

93. 复原 IP 地址

链接:93. 复原 IP 地址

在这里插入图片描述

解题思路

  1. travalBack 函数是递归函数,用于遍历字符串 s 中可能的 IP 地址组合。它有三个参数:staticIndec 表示当前小节的起始位置,dotCount 表示已经添加的逗号数量。

  2. dotCount 等于 3 时,说明已经添加了三个逗号,此时可以判断第三个逗号后面的字符组成的字符串是否满足 IP 地址的要求。如果满足,则将该情况存入 res 中。

  3. travalBack 函数中使用循环来遍历从 staticIndec 开始到字符串末尾的位置。对于每一个位置 i,判断从 staticIndeci 组成的小节是否满足 IP 地址的要求。

  4. 如果满足条件,则在 s 中插入逗号,并递归调用 travalBack 函数,同时更新 staticIndeci+2dotCount 加 1,表示处理下一个小节。

  5. 在递归调用结束后,需要将插入的逗号删除,以便进行下一次循环。

  6. isIPmember 函数用于判断一个字符串是否满足 IP 地址的要求。它将字符串转换为整数,并进行一系列的判断条件,包括长度不为 1 且以 0 开头、只包含数字字符等。

  7. restoreIpAddresses 函数中,首先对输入字符串 s 的长度进行判断,如果小于 4 或大于 12,则直接返回空结果。然后调用 travalBack 函数开始递归遍历。

  8. 最终返回存储所有满足条件的 IP 地址组合的 res

AC代码

class Solution {
public:vector<string> res;//staticIndec是这小节的开始,dotCount是添加逗号的数量void travalBack(string& s,int staticIndec,int dotCount){if(dotCount==3){//如果添加的逗号的数量等于3了就可以判断第三个逗号后面的字符组成的字符串是否满足条件,满足就把这一种情况存到res中。if(isIPmember(s,staticIndec,s.size()-1))res.push_back(s);return;}for(int i=staticIndec;i<s.size();++i){if(isIPmember(s,staticIndec,i)){//判断这一节是否满足条件s.insert(s.begin() + i + 1 , '.');//向s中插入逗号"."travalBack(s,i+2,dotCount+1);//因为插入了逗号,所以staticIndec要多加1s.erase(s.begin() + i + 1);}else break;} }bool isIPmember(string& s,int l,int r){string str = s.substr(l,r-l+1);if(str.size()!=1 && str[0]=='0')return false;for(int i=0;i<str.size();++i){if(str[i]>'9'||str[i]<'0'){return false;}}if(str=="")return false;if(stoll(str)>255)return false;return true;}vector<string> restoreIpAddresses(string s) {if(s.size()<4||s.size()>12)return res;travalBack(s,0,0);return res;}
};

78. 子集

链接:78. 子集

在这里插入图片描述

解题思路

  • 终止条件:不需要写出来因为当staticIndex>nums.size()时,循环已经终止了

  • for循环内:在进入下一个节点前先将自己这个节点载入path中,出来时就删去

  • 可以看作是二叉树的前序遍历

AC代码

class Solution {
public:vector<vector<int>> res;vector<int> path;void travalBack(vector<int>& nums,int staticIndex){res.push_back(path);for(int i=staticIndex;i<nums.size();++i){path.push_back(nums[i]);travalBack(nums,i+1);path.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {travalBack(nums,0);return res;}
};

90. 子集 II

链接:90. 子集 II

在这里插入图片描述

解题思路

  • 在求组合三的时候讲过解题思路,这题也是类似的参看《[算法训练营] 回溯算法专题(一)》

AC代码

class Solution {
public:vector<vector<int>> res;vector<int> path;void travalBack(vector<int>& nums,int staticIndex,vector<bool> used){res.push_back(path);for(int i=staticIndex;i<nums.size();++i){if(i>0&&nums[i]==nums[i-1]&&used[i-1]==false){continue;}else{path.push_back(nums[i]);used[i]=true;travalBack(nums,i+1,used);used[i]=false;path.pop_back();}}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(),nums.end());vector<bool> used(nums.size(),false);travalBack(nums,0,used);return res;}
};

491. 递增子序列

链接:491. 递增子序列

在这里插入图片描述

解题思路

  • 终止条件:当path长度大于2时都可以保留,但是和之前不同在于不需要return,如果return会导致只有长度为2的path

  • 这题需要去重但是不能使用排序,因为题目要求是原数组的递增子序列

  • 在判断是否能够加入当前数字时的条件是:

    • 如果当前的path不为空,那么前一个值必须比后一个值小,否则跳过

    • 还有就是当前的值是否“用过”,这里需要注意一个点,在for循环之前要使用一个set来记录元素是否使用过,如果使用过就要跳过,避免重复

AC代码


class Solution {
public:vector<vector<int>> res;vector<int> path;void travalBack(vector<int>& nums,int staticIndex){if(path.size()>=2){res.push_back(path);}unordered_set<int> umap;for(int i=staticIndex;i<nums.size();++i){if((!path.empty()&&path.back()>nums[i])||umap.find(nums[i])!=umap.end()){continue;}else{path.push_back(nums[i]);umap.insert(nums[i]);travalBack(nums,i+1);path.pop_back();}}}vector<vector<int>> findSubsequences(vector<int>& nums) {travalBack(nums,0);return res;}
};

46. 全排列

链接:46. 全排列

在这里插入图片描述

解题思路

  1. 首先,定义了一个全局变量res,用于存储最终的结果,即全排列的集合。

  2. 定义了一个全局变量path,用于存储当前正在生成的一个排列。

  3. 定义了一个辅助函数travalBack,用于进行回溯遍历生成全排列。

  4. travalBack函数中,首先判断当前path的长度是否等于给定数组nums的长度,如果相等,说明已经生成了一个完整的排列,将其加入到res中,并返回。

  5. 如果path的长度不等于nums的长度,就需要继续生成排列。通过一个循环遍历nums数组的每一个元素。

  6. 在循环中,首先判断当前元素是否已经被使用过,即used[i]是否为true,如果是,则跳过当前元素,继续下一次循环。

  7. 如果当前元素没有被使用过,将其加入到path中,将used[i]设置为true表示该元素已经被使用。

  8. 然后,递归调用travalBack函数,继续生成下一个元素的排列。

  9. 在递归调用结束后,需要将used[i]重新设置为false,表示该元素未被使用。

  10. 同时,还需要将path中的最后一个元素移除,以便生成下一个排列。

  11. permute函数中,首先创建一个大小为nums长度的布尔型数组used,初始值都为false

  12. 然后调用travalBack函数,开始生成全排列。

  13. 最后返回得到的全排列结果res

AC代码

class Solution {
public:vector<vector<int>> res;vector<int> path;//排列和组合不同,它在乎顺序和单次,所以要使用一个数组used来记录是否使用过void travalBack(vector<int>&nums ,vector<bool> used){//判断是否是全排列,即包含所有元素if(path.size()==nums.size()){res.push_back(path);return;}for(int i=0;i<nums.size();++i){//used[i]等于true说明已经使用1过这个数了,就要跳过if(used[i]==true)continue;path.push_back(nums[i]);used[i]=true;travalBack(nums,used);used[i]=false;path.pop_back();}}vector<vector<int>> permute(vector<int>& nums) {vector<bool> used(nums.size(),false);travalBack(nums,used);return res;}
};

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

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

相关文章

Android笔记(七)Android JetPack Compose组件搭建Scaffold脚手架

在去年2022年曾发布一篇关于脚手架的文章&#xff1a;“Android JetPack Compose组件中Scaffold的应用” 。但是Android的版本从12变更到13及以上版本&#xff0c;导致一些细节的实现存在不同。在本文中&#xff0c;将从头开始介绍整个脚手架的搭建过程。 一、新建项目模块 在…

从0到1配置TensorRT环境

根据博文&#xff1a;TensorFlow2.x模型转onnx、TensorRT给出的环境来配置。 以下是该博文中给出的版本信息 TensorFlow 2.4 CUDA 11.1 CUDNN 8 TensorRT 8.2.1.8 tf2onnx 1.13.0 onnx 1.12.0 下载地址 包下载地址TensorRT 8.2.1.8https://developer.nvidia.com/nvidia-tenso…

【Overload游戏引擎细节分析】standard材质Shader

提示&#xff1a;Shader属于GPU编程&#xff0c;难写难调试&#xff0c;阅读本文需有一定的OpenGL基础&#xff0c;可以写简单的Shader&#xff0c;不适合不会OpenGL的朋友 一、Blinn-Phong光照模型 Blinn-Phong光照模型&#xff0c;又称为Blinn-phong反射模型&#xff08;Bli…

腾讯云抱歉不满足产品首购条件解决方法

购买腾讯云服务器提示“抱歉&#xff0c;检测到相同实名认证主体已购买&#xff0c;不满足产品首购条件&#xff0c;您可了解其他商品。”&#xff0c;购买腾讯云特价云服务器是有新用户首购限制的&#xff0c;说当前腾讯云认证主体的其他账号已经购买过云服务器&#xff0c;一…

【wespeaker】模型ECAPA_TDNN介绍

本次主要介绍开源项目wespeaker模型介绍 1. 模型超参数 model_args: feat_dim: 80 embed_dim: 192 pooling_func: “ASTP” projection_args: project_type: “softmax” # add_margin, arc_margin, sphere, softmax scale: 32.0 easy_margin: False 2. 模型结构 2.1 Layer…

node-red常用包分析

node-red-contrib-opcua Use OpcUa-Item to define variables. Use OpcUa-Client to read / write / subscribe / browse OPC UA server. 需要想通过OpcUa-Item节点来指定一个数据点。 触发器-->opcua_item----->opcua_client opcua_client的Action项解析&#xff1a; …

HugeGraph Hubble 配置 https 协议的操作步骤

背景 HugeGraph 图数据库的 Server 端支持 https 配置&#xff0c;官方文档中有说明相对比较容易&#xff0c;而 Hubble 部署过程都是 http的。 我们有一个应用要嵌入 hubble 页面&#xff0c;而且部署为 https &#xff0c;那么 Hubble 是否支持配置 https 呢&#xff1f;网…

大数据技术学习笔记(三)—— Hadoop 的运行模式

目录 1 本地模式2 伪分布式模式3 完全分布式模式3.1 准备3台客户机3.2 同步分发内容3.2.1 分发命令3.2.2 执行分发操作 3.3 集群配置3.3.1 集群部署规划3.3.2 配置文件说明3.3.3 修改配置文件3.3.4 分发配置信息 3.4 SSH无密登录配置3.4.1 配置ssh3.4.2 无密钥配置 3.5 单点启动…

C++【多态】

文章目录&#xff1a; C 多态1. 多态的概念2. 多态的定义和实现2.1 构成多态的必要条件2.2 虚函数和重写2.3 虚函数重写的两个例外2.4 例题运用2.5 final 和 override2.6 重载、重写、重定义 3. 抽象类4. 多态的原理4.1 虚表指针4.2 多态和非多态调用4.3 回想满足条件4.4 虚函数…

Selenium中WebDriver最新Chrome驱动安装教程

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

【广州华锐互动】智能家居设计3D虚拟还原系统

随着科技的飞速发展&#xff0c;人们对家居生活的需求也在不断提高。智能家居作为一种新兴的生活方式&#xff0c;正逐渐成为现代人追求的理想居住环境。而智能家居设计3D虚拟还原系统&#xff0c;正是为了让人们更好地了解和体验智能家居带来的便捷与舒适&#xff0c;让未来生…

聚观早报 |2024年春节连休8天;RTE2023开幕

【聚观365】10月26日消息 2024年春节连休8天 RTE2023开幕 一加12首发“东方屏” 微软公布2024财年第一财季财报 Alphabet Q3业绩好于预期 2024年春节连休8天 国务院办公厅发布关于2024年部分节假日安排的通知。2024年春节&#xff0c;2月10日至17日放假调休&#xff0c;共…

面向边缘场景的 PWA 实践

背景 随着5G技术的发展&#xff0c;物联网边缘侧主要应用于数据传输量大、安全要求高以及数据实时处理等行业与应用场景中。其中&#xff0c;边缘计算是一种分布式计算模式&#xff0c;其将计算资源和数据处理能力推向接近数据源的边缘设备&#xff0c;以减少延迟并提高响应速度…

信息系统架构的设计理论与实践

信息系统架构的设计理论与实践 信息系统架构概述 信息系统架构的定义和发展 信息系统架构的定义 骚戴理解&#xff1a;这里只要背定义即可 信息系统架构的发展 信息系统架构的分类&#xff08;集中式和分布式&#xff09; 集中式结构 分布式结构 信息系统常用的四种架构模型…

番外8.2---配置/管理硬盘

""" Step1&#xff1a;清楚磁盘、硬盘&#xff08;HDD&#xff09;、光驱的概念及是否具有包含关系。 Step2&#xff1a;硬件设备&#xff08;IDE、SCSI、SATA、NVMe、软驱等&#xff09;命名方式及在linux系统里对应的文件名称。 Step3&#xff1a;&#xff1…

2023-10学习笔记

1.sql注入 不管是上一篇博客&#xff0c;通过java代码执行sql 还是我们常用的Mybatis的#{}和${} 都会提到sql注入的问题 1.1啥是sql注入 应该知道是说传入无关的参数&#xff0c;比如本来是想要一个where条件查询参数 但是你拼了一个drop 比如 原来的sql select * from…

正点原子嵌入式linux驱动开发——RGB转HDMI

目前大多数的显示器都提供了HDMI接口&#xff0c;HDMI的应用范围也越来越广&#xff0c;但是STM32MP157这颗芯片原生并不支持HDMI显示。可以通过RGB转HDMI芯片将RGB信号转为HDMI信号&#xff0c;这样就可以连接HDMI显示器了。本章就来学习一下如何在正点原子的STM32MP1开发板上…

《从零开始大模型开发与微调 :基于PyTorch与ChatGLM》简介

内 容 简 介 大模型是深度学习自然语言处理皇冠上的一颗明珠&#xff0c;也是当前AI和NLP研究与产业中最重要的方向之一。本书使用PyTorch 2.0作为学习大模型的基本框架&#xff0c;以ChatGLM为例详细讲解大模型的基本理论、算法、程序实现、应用实战以及微调技术&#xff0c;…

Qt中的枚举变量,Q_ENUM,Q_FLAG以及Qt中自定义结构体、枚举型做信号参数传递

Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他 理论基础&#xff1a;一、Q_ENUM二、QMetaEnum三、Q_FLAG四、示例 Chapter1 Qt中的枚举变量,Q_ENUM,Q_FLAG,Q_NAMESPACE,Q_ENUM_NS,Q_FLAG_NS以及其他前言Q_ENUM的使用Q_FLAG的引入解决什么问题&#xf…

Pytorch指定数据加载器使用子进程

torch.utils.data.DataLoader(train_dataset, batch_sizebatch_size, shuffleTrue,num_workers4, pin_memoryTrue) num_workers 参数是 DataLoader 类的一个参数&#xff0c;它指定了数据加载器使用的子进程数量。通过增加 num_workers 的数量&#xff0c;可以并行地读取和预处…