代码随想录算法训练营第28天 |第七章 回溯算法part04

学习目标:

  • 93.复原IP地址
  • 78.子集
  • 90.子集II

学习内容:

93.复原IP地址

/class Solution {
public:// string path;vector<string> result;bool isValid(const string& s, int start, int end) {if(start>end)return false;if(s[start]=='0'&&(end-start) >= 1)return false;int num=0;for(int i=start;i<=end;i++){if(s[i]<'0'||s[i]>'9')//遇到异常字符return false;num = num * 10 + (s[i] - '0');if(num>255)return false;}return true;}void backtracking(string s,int startIndex, int pointNum){if(pointNum == 3){// 判断第四段子字符串是否合法,如果合法就放进result中if (isValid(s, startIndex, s.size() - 1)) {result.push_back(s);}return;}for(int i = startIndex;i<s.size();i++){if(isValid(s,startIndex,i)){s.insert(s.begin() + i + 1 , '.');  // 在i的后面插入一个逗点pointNum++;backtracking(s,i+2,pointNum);pointNum--;s.erase(s.begin() + i + 1);         // 回溯删掉逗点}else{break;}}}vector<string> restoreIpAddresses(string s) {int startIndex =0;int pointNum=0;if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了backtracking(s,startIndex,pointNum);return result;}
};

错误以及注意事项

  • backtracking(s,i+2,pointNum); 因为添加了一个点,所以应该从i+2开始下一轮回溯。
  • continue 用于跳过当前迭代,继续下一次迭代,而 break 用于立即退出当前循环。所以在发现s中的某一段已经不符合IP地址要求后应该立刻break跳出循环。
  • if(num>255||num<0) return false; 不需要检查num<0,因为num 是无符号整数,不可能小于0。另外,对于当前数字的首位为0的情况,可以直接跳过而不用继续判断后续数字。这样可以提高效率和简化代码。
  • if (s.size() < 4 || s.size() > 12) return result; // 算是剪枝了 并没有想到这个

78.子集

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

在这里插入图片描述

错误以及注意事项

  • 想了半天卡在了树没有画对。
//或者终止条件改改然后把收集的子集那一行放在上面
class Solution {
private:vector<vector<int>> result;vector<int> path;void backtracking(vector<int>& nums, int startIndex) {result.push_back(path); // 收集子集,要放在终止添加的上面,否则会漏掉自己if (startIndex >= nums.size()) { // 终止条件可以不加return;}for (int i = startIndex; i < nums.size(); i++) {path.push_back(nums[i]);backtracking(nums, i + 1);path.pop_back();}}
public:vector<vector<int>> subsets(vector<int>& nums) {result.clear();path.clear();backtracking(nums, 0);return result;}
};

90.子集II

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

错误以及注意事项

  • ac!但是要找时间刷排序。


continue和break的区别

在 C++ 中,continuebreak 是两种用于控制流程的关键字,它们的作用和用法略有不同:

  1. continue
    • continue 语句用于终止当前迭代的循环,并开始下一次迭代。
    • 当程序执行到 continue 语句时,它会跳过当前迭代中剩余的代码,直接开始下一次迭代。
    • 主要用于在循环中执行一些条件检查,如果某些条件满足,就跳过当前迭代,执行下一次迭代。

示例:

for (int i = 0; i < 5; ++i) {if (i == 2) {continue; // 当 i 等于 2 时,跳过当前迭代,开始下一次迭代}cout << i << endl;
}
// 输出:
// 0
// 1
// 3
// 4
  1. break
    • break 语句用于立即终止当前所在的循环(forwhiledo-while 循环),并跳出该循环。
    • 当程序执行到 break 语句时,它会退出当前的循环,继续执行循环后面的代码。
    • 主要用于在循环中满足某些条件时提前终止循环,通常用于在搜索或迭代过程中找到所需结果后立即退出循环。

示例:

for (int i = 0; i < 5; ++i) {if (i == 3) {break; // 当 i 等于 3 时,立即退出循环}cout << i << endl;
}
// 输出:
// 0
// 1
// 2

总之,continue 用于跳过当前迭代,继续下一次迭代,而 break 用于立即退出当前循环。

学习时间:

2024.2.22 19:30-21:44

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

SELF-RAG 论文详解

论文&#xff1a; https://arxiv.org/pdf/2310.11511.pdf code&#xff1a; https://github.com/langchain-ai/langgraph/blob/main/examples/rag/langgraph_self_rag.ipynb?refblog.langchain.dev 相关工作 RAG 尽管 RAG 方法可以通过检索生成得到更为准确的结果&#xff0…

Codeforce Monsters Attack!(B题 前缀和)

题目描述&#xff1a; 思路&#xff1a; 本人第一次的想法是先杀血量低的第二次想法是先搞坐标近的第三次想法看到数据量这么大&#xff0c; 我先加个和看看貌似我先打谁都行&#xff0c;由此综合一下&#xff0c; 我们可以把每一个不同的坐标当作一轮从最小的坐标开始&#x…

老子云2024全站焕新,重塑3D轻量体验

3D模型当前应用广泛&#xff0c;正以惊人的速度实现数据增长&#xff0c;轻量化需求随之增多。老子云团队一直在探索如何借助自研轻量化技术的能力&#xff0c;打破用户模型处理思维惯性&#xff0c;构建更高效、实用、简单的体验范式&#xff0c;来帮助用户解决3D素材数据处理…

开源工具和框架

目录 开源工具和框架 一、 开源工具和框架 二、开源工具和框架在现代软件开发中的角色 1、基础设施建设&#xff1a; 2、开发效率提升&#xff1a; 3、代码质量保障&#xff1a; 4、技术创新&#xff1a; 三、广泛使用的开源项目分析 3.1、Linux 3.2、Git 3.3、Docke…

js设计模式:状态模式

作用: 将对象的行为和状态进行分离,状态是由行为操作决定的,而不是直接控制。 同时,行为也是由状态决定的,每个状态都有自己的行为和相应的方法 行为与状态分离,可以使代码方便维护 示例: <!DOCTYPE html> <html lang"en"><head><meta cha…

THE TRAVELING OBSERVER MODEL

FiLM (Perez et al., 2018) 作者未提供代码 参考文献 [1] E. Perez, F. Strub, H. de Vries, Vincent Dumoulin, and Aaron C. Courville. Film: Visual reasoning with a general conditioning layer. In Proc. of AAAI, 2018.

华为OD机试真题-万能字符单词拼写-2023年OD统一考试(C卷)---Python3--开源

题目&#xff1a; 考察内容&#xff1a; str.repalce(old, new, 1); flag 代码&#xff1a; """ 题目分析&#xff1a; 没有掌握&#xff0c;输出为0 输入&#xff1a; words的个数&#xff0c; N int 每个字符串元素输出&#xff1a; 词汇表words中掌握的单…

软件实际应用实例,茶楼收银软件管理系统操作流程,茶室计时计费会员管理系统软件试用版教程

软件实际应用实例&#xff0c;茶楼收银软件管理系统操作流程&#xff0c;茶室计时计费会员管理系统软件试用版教程 一、前言 以下软件以 佳易王茶社计时计费管理系统软件V17.9为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、计时计费&…

SpringBoot:数据访问-整合 Druid 配置数据源监控

点击查看数据访问demo&#xff1a;LearnSpringBoot06DataJdbc 点击查看更多的SpringBoot教程 简介 Druid Spring Boot Starter 用于帮助你在Spring Boot项目中轻松集成Druid数据库连接池和监控。 一、添加druid-spring-boot-starter依赖 点击查询最新版 <dependency&g…

正版IDM多少钱?如何便宜购买序列号

IDM是一款互联网下载神器&#xff0c;它的全称是Internet Download Manager&#xff0c;可以将下载速度提升至5倍以上。那么IDM正版多少钱&#xff1f;如何才能买到正版IDM序列号呢&#xff1f; 正版IDM的价格根据付费模式和购买渠道不同&#xff0c;所需要的价格也是不同的。…

Vulnhub靶机:Hacker_Kid

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;Hacker_Kid&#xff08;10.0.2.42&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/hac…

zkLogin如何使加密学变得更快更安全

*本篇来自Mysten Labs官方blog&#xff0c;文中“我们”指代该组织。 zkLogin不仅是将更多用户引入Web3应用的一次革命性飞跃&#xff0c;其开发还使零知识&#xff08;ZK&#xff09;API变得更安全更快速。然而&#xff0c;开发zkLogin&#xff0c;Sui的OAuth认证原语&#x…

全网唯一基于共享内存的C++ RPC框架

首先声明&#xff1a;我不是标题党&#xff0c;我是在找遍全网&#xff0c;没有找到一个基于共享内存实现、开源且跨平台的C RPC框架之后&#xff0c;才着手开发的这个框架。 项目地址&#xff1a;https://github.com/winsoft666/veigar 1. Veigar Veigar一词来源于英雄联盟里…

彩虹全新 SUP 模板,卡卡云模板修复版

彩虹全新 SUP 模板&#xff0c;卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化&#xff0c;修复了 PC 端购物车页面显示不正常的问题。下载地址&#xff1a;彩虹全新 SUP 模板.zip 模板截图

vscode 设置打开中断的默认工作目录/路径

vscode 设置打开终端的默认工作目录/路径** 文章目录 vscode 设置打开终端的默认工作目录/路径**打开vscode&#xff0c;打开设置UI 或是设置JSON文件&#xff0c;找到相关设置项方式1&#xff1a;通过打开settings.json的UI界面 设置:方式2&#xff1a;通过打开设置settings.j…

音视频开发之旅(69)-SD图生图

目录 1. 效果展示 2. ControlNet介绍 3. 图生图流程浅析 4. SDWebui图生图代码流程 5. 参考资料 一、效果展示 图生图的应用场景非常多&#xff0c;比较典型的应用场景有风格转化&#xff08;真人与二次元&#xff09;、线稿上色、换装和对图片进行扩图等&#xff0c;下面…

【前沿热点视觉算法】-RGB-D显著目标检测的边缘感知多模态变压器

计算机视觉算法分享。问题或建议&#xff0c;请文章私信或者文章末尾扫码加微信留言。 1 论文题目 RGB-D显著目标检测的边缘感知多模态变压器 2 论文摘要 RGB-D显著目标检测&#xff08;SOD&#xff09;近年来引起了广泛的关注。特别是&#xff0c;变压器已被使用&#xff0c;并…

vmware安装centos 7.9 操作系统

vmware安装centos 7.6 操作系统 1、下载centos 7.9 操作系统镜像文件2、安装centos 7.9 操作系统3、配置centos 7.6 操作系统3.1、配置静态IP地址 和 dns3.2、查看磁盘分区3.3、查看系统版本 1、下载centos 7.9 操作系统镜像文件 本文选择centos 7.9 最小化安装镜像包 这里选…

C++ //练习 8.7 修改上一节的书店程序,将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。

C Primer&#xff08;第5版&#xff09; 练习 8.7 练习 8.7 修改上一节的书店程序&#xff0c;将结果保存到一个文件中。将输出文件名作为第二个参数传递给main函数。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /********…

pthread_cond_timedwait()函数

绝对时间&#xff1a;相对于1970年1月1日0时0分0秒 相对时间&#xff1a;相对于当前时间&#xff0c;如sleep(3);相对于当前&#xff0c;过3s.