算法训练(leetcode)第二十一天 | 93. 复原 IP 地址、78. 子集、90. 子集 II

刷题记录

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

93. 复原 IP 地址

leetcode题目地址

题目有一个很重要的要求:你 不能 重新排序或删除 s 中的任何数字。你可以按 任何 顺序返回答案。 也就是说ip地址中需要包含整个字符串中的字符且顺序不可变。

ip地址的每一个数字都需要在[0, 255]范围内,所以其截取的长度就是1-3。

回溯终止条件“:使用一个数组cur记录当前ip中的数字,若当前已有四个数字且字符串内的数字均包含在内,则将cur中存储的数字拼成一个ip放入结果数组中并返回。

回溯:从起始位置开始截取子串并判断当前子串组成的数字是否是在[0, 255]区间内,若是则继续查找后面位置的子串。 这里有一个小trick就是组成[0, 255]的数字的长度是[1, 3],所以最长截取位置就是起始位置后三位的位置,也就是left+3。

(另一种思路)

时间复杂度: O ( 3 4 ) O(3^4) O(34)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:vector<string> cur;bool isValid(const string& s, int left, int right){// 非0元素有前导0if(right>left && s[left]=='0') return false;int res = 0;for(int i=left; i<=right; i++){res = res*10 + s[i]-'0';}if(res>=0 && res<=255 ) return true;return false;}void backtracking(vector<string> & result, const string &s, int left){if(cur.size() == 4 && left>=s.size()){string str = "";for(int i=0; i<cur.size(); i++){if(i>0) str += ".";str += cur[i];}result.emplace_back(str);return;}// 这行代码可有可无 因为起始下标超过数组长度就不会进入下面的循环if(left>=s.size()) return;// 截取子串 长度区间为[1, 3]for(int i=left; i<s.size() && i<left+3; i++){if(isValid(s, left, i)){string str = s.substr(left, i-left+1);cur.emplace_back(str);backtracking(result, s, i+1);cur.pop_back();}}}vector<string> restoreIpAddresses(string s) {vector<string> result;backtracking(result, s, 0);return result;}
};

78. 子集

leetcode题目地址

这一题比较简单,从起始位置遍历,将其每一次的结果都放入最终结果中既可。需要在最初将空集放入最终结果数组中。

时间复杂度: O ( n ∗ 2 n ) O(n*2^n) O(n2n)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:vector<int> cur;void backtracking(vector<vector<int>> & result, const vector<int>& nums, int left){// 这一行可有可无  因为起始下标查过数组长度不会进入下边循环if(left>nums.size()) return;for(int i=left; i<nums.size(); i++){cur.emplace_back(nums[i]);result.emplace_back(cur);backtracking(result, nums, i+1);cur.pop_back();}}vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> result;result.emplace_back(cur);backtracking(result, nums, 0);return result;}
};

90. 子集 II

leetcode题目地址

在上一题的基础上加一步去重即可。去重需要判断元素与前一个元素是否相同,因此先对nums进行排序,使其相同元素相邻。

去重做法和40. 组合总和 II相同(题解)。

时间复杂度: O ( n ) O(n) O(n)
空间复杂度: O ( n ) O(n) O(n)

// c++
class Solution {
public:vector<int> cur;void backtracking(vector<vector<int>> & result, const vector<int>& nums, int left){// 这一行可有可无  因为起始下标查过数组长度不会进入下边循环if(left>nums.size()) return;for(int i=left; i<nums.size(); i++){// 去重if(i>left && nums[i]==nums[i-1]) continue;cur.emplace_back(nums[i]);result.emplace_back(cur);backtracking(result, nums, i+1);cur.pop_back();}}vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<vector<int>> result;// 排序result.emplace_back(cur);sort(nums.begin(), nums.end());backtracking(result, nums, 0);return result;}
};

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

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

相关文章

数字孪生煤矿智能化综合管控平台

煤矿可视化通过图扑 HT 实现实时数据集成和三维建模仿真&#xff0c;呈现井下环境、设备状态和生产状况等多维度数据&#xff0c;帮助管理人员进行直观监控和精准分析。该技术提升了运营效率和安全水平&#xff0c;为煤矿作业提供了智能化的管理解决方案&#xff0c;有助于减少…

黑马点评DAY1|Redis入门、Redis安装

什么是Redis&#xff1f; redis是一种键值型数据库&#xff0c;内部所存的数据都是键值对的形式&#xff0c;例如&#xff0c;我们可以把一个用户数据存储为如下格式&#xff1a; 键值id$1600name张三age21 但是这样的存储方式&#xff0c;数据会显得非常松散&#xff0c;因…

云计算HCIE+RHCE学员的学习分享

大一下学期&#xff0c;我从学长嘴里了解到誉天教育&#xff0c;当时准备考RHCE&#xff0c;我也了解了很多培训机构&#xff0c;然后学长强烈给我推荐誉天&#xff0c;我就在誉天报名了RHCE的课程。 通过杨峰老师的教学&#xff0c;我学到了许多Linux知识&#xff0c;也了解了…

笔记本电脑部署VMware ESXi 6.0系统

正文共&#xff1a;888 字 18 图&#xff0c;预估阅读时间&#xff1a;1 分钟 前面我们介绍了在笔记本上安装Windows 11操作系统&#xff08;Windows 11升级不了&#xff1f;但Win10就要停服了啊&#xff01;来&#xff0c;我教你&#xff01;&#xff09;&#xff0c;也介绍了…

【单片机毕业设计选题24037】-基于STM32的电力系统电力参数无线监控系统

系统功能: 系统上电后&#xff0c;OLED显示“欢迎使用电力监控系统请稍后”&#xff0c;两秒后显示“Waiting..”等待ESP8266初始化完成&#xff0c; ESP8266初始化成功后进入正常页面显示&#xff0c; 第一行显示电压值&#xff08;单位V&#xff09; 第二行显示电流值&am…

Java 使用Objects equals 、 != 、equals 比较对象之间的区别?

在Java中&#xff0c;比较对象是否相等的方法主要有三种&#xff1a;Objects.equals() 方法、! 操作符和 equals() 方法。它们之间的区别如下&#xff1a; Objects.equals() 方法&#xff1a; Objects.equals(a, b) 是一个静态方法&#xff0c;用于安全地比较两个对象是否相等。…

FastAPI中的Lifespan和异步上下文管理器:深入理解和实践

FastAPI中的Lifespan和异步上下文管理器&#xff1a;深入理解和实践 FastAPI中的Lifespan和异步上下文管理器&#xff1a;深入理解和实践1. 代码解析2. 异步上下文管理器2.1 什么是异步上下文管理器&#xff1f;2.2 asynccontextmanager装饰器2.3 代码示例 3. FastAPI的Lifespa…

现代信息检索笔记(一)

目录 什么是信息检索 应用一&#xff1a;做搜索引擎 应用二&#xff1a;信息推荐系统 应用三&#xff1a;婚恋网站 信息检索的具体应用 从信息规模上分类 为什么要学习信息检索技术&#xff1f; 市场发展需求大 应用需求多&#xff1a; 课程情况 课程宗旨 国际著名…

互联网大厂核心知识总结PDF资料

我们要敢于追求卓越&#xff0c;也能承认自己平庸&#xff0c;不要低估3&#xff0c;5&#xff0c;10年沉淀的威力 hi 大家好&#xff0c;我是大师兄&#xff0c;大厂工作特点是需要多方面的知识和技能。这种学习和积累一般人需要一段的时间&#xff0c;不太可能一蹴而就&…

使用 FastAPI 实现聊天完成 API 详解

使用 FastAPI 实现聊天完成 API 详解 简介基础概念FastAPIPydanticPyTorch 代码详解1. 定义 API 端点2. 请求验证3. 生成参数字典4. 处理流式响应5. 工具调用处理6. 非流式响应处理7. 处理使用信息和工具调用8. 构建聊天消息9. 构建响应选择10. 更新使用信息11. 返回最终响应 总…

SQL Server触发器深度解析:数据完整性的守护者

标题&#xff1a;SQL Server触发器深度解析&#xff1a;数据完整性的守护者 摘要 在SQL Server中&#xff0c;触发器是一种特殊的存储过程&#xff0c;它在特定数据库事件发生时自动执行。触发器主要用于维护数据的完整性和实施复杂的业务规则。本文将详细介绍SQL Server中触…

ubuntu 添加PATH

在Ubuntu中&#xff0c;PATH是一个环境变量&#xff0c;用于指定系统查找可执行文件的目录列表。如果你想将新的目录添加到PATH中&#xff0c;可以按照以下步骤操作&#xff1a; 临时添加PATH 你可以在终端中使用export命令临时修改PATH环境变量。例如&#xff0c;如果你想将…

Python使用彩虹表来尝试对MD5哈希进行破解

MD5是一种散列算法&#xff0c;它是不可逆的&#xff0c;无法直接解密。它的主要作用是将输入数据进行散列&#xff0c;生成一个固定长度的唯一哈希值。 然而&#xff0c;可以使用预先计算好的MD5哈希值的彩虹表&#xff08;Rainbow Table&#xff09;来尝试对MD5进行破解。彩…

c++函数(一)习题讲解

1.【单选题】 void swap (int a,int b) { a a ^ b; b a ^ b; a a ^ b; } int a {120},b {130}; swap{a,b}; a? b? A 120,130 B 130,120 C130,0 解析&#xff1a;这道题中&#xff0c;函数体的内容是交换两个变量的值&#xff0c;采用的是位运算的…

Java中泛型的概念和使用场景

技术难点 Java中的泛型&#xff08;Generics&#xff09;是JDK 5.0引入的一项新特性&#xff0c;它允许在定义类、接口和方法时使用类型参数&#xff08;type parameters&#xff09;。泛型的主要技术难点在于类型擦除&#xff08;type erasure&#xff09;和类型推断&#xf…

Day48

Day48 手写Spring-MVC之前后置处理器与异常处理 前后置处理器 概念&#xff1a;从服务器获取的JSON数据可能是加密后的&#xff0c;因此服务端获取的时候需要进行解密&#xff08;前置处理器&#xff09;。 而从服务器传出的JSON数据可能需要加密&#xff0c;因此需要在处理返…

VMware虚拟机迁移:兼用性踩坑和复盘

文章目录 方法失败情况分析&#xff1a;参考文档 方法 虚拟机关机&#xff0c;整个文件夹压缩后拷贝到新机器中&#xff0c;开机启用即可 成功的情况&#xff1a; Mac (intel i5) -> Mac (intel i7)Mac (intel, MacOS - VMware Fusion) -> DELL (intel, Windows - VMw…

Zynq7000系列FPGA中的DMA控制器简介(二)

AXI互连上的DMA传输 所有DMA事务都使用AXI接口在PL中的片上存储器、DDR存储器和从外设之间传递数据。PL中的从设备通过DMAC的外部请求接口与DMAC通信&#xff0c;以控制数据流。这意味着从设备可以请求DMA交易&#xff0c;以便将数据从源地址传输到目标地址。 虽然DMAC在技术…

mysql5.7安装使用

mysql5.7安装包&#xff1a;百度网盘 提取码: 0000 一、 安装步骤 双击安装文件 选择我接受许可条款–Next 选择自定义安装&#xff0c;下一步 选择电脑对应的系统版本后(我的系统是64位)&#xff0c;点击中间的右箭头&#xff0c;选择Next 选择安装路径–Next 执行…

.NET之C#编程:懒汉模式的终结,单例模式的正确打开方式

概述 在C#编程世界中&#xff0c;单例模式是一种常见的设计模式&#xff0c;用于确保一个类只有一个实例&#xff0c;并提供一个全局访问点。然而&#xff0c;传统的懒汉模式实现方式在多线程环境下存在安全隐患。本文将深入探讨单例模式的正确实现姿势&#xff0c;带你走出懒汉…