代码随想录第三十六天——无重叠区间,划分字母区间,合并区间

leetcode 435. 无重叠区间

题目链接:无重叠区间

方法一:按右边界排序

按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数。此时问题转化为求非交叉区间的最大个数。

版本一:
class Solution {
public:// 按照区间右边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[1] < b[1];}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp);int count = 1; // 记录非交叉区间的个数int end = intervals[0][1]; // 记录区间分割点for (int i = 1; i < intervals.size(); i++) {if (end <= intervals[i][0]) {end = intervals[i][1];count++;}}return intervals.size() - count;}
};

时间复杂度:O(nlog n) ,考虑快排
空间复杂度:O(n),考虑快排,最差情况(倒序),需要n次递归调用。因此需要O(n)的栈空间

版本二:

借鉴 leetcode 452. 用最少数量的箭引爆气球的方法,弓箭的数量就相当于是非交叉区间的数量,只要把判断条件加个等号,然后用总区间数减去弓箭数量 就是要移除的区间数量

class Solution {
public:// 按照区间右边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[1] < b[1]; // 右边界排序 }int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp);int res = 1; // points不为空至少需要一支箭for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= intervals[i - 1][1]) {res++; // 需要一支箭}else {  // 气球i和气球i-1挨着intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]); //更新重叠气球最小右边界}}return intervals.size() - res;}
};

方法二:按左边界排序

版本一:

左边界排序直接求重叠的区间

class Solution {
public:static bool cmp (const vector<int>& a, const vector<int>& b) {return a[0] < b[0]; // 改为左边界排序}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp);int count = 0; // 注意这里从0开始,因为是记录重叠区间int end = intervals[0][1]; // 记录区间分割点for (int i = 1; i < intervals.size(); i++) {   if (intervals[i][0] >= end)  end = intervals[i][1]; // 无重叠的情况else { // 重叠情况 end = min(end, intervals[i][1]);count++;}}return count;}
};
版本二:

借鉴 leetcode 452. 用最少数量的箭引爆气球的方法,原理和方法一的版本二原理一致。

class Solution {
public:// 按照区间左边界排序static bool cmp (const vector<int>& a, const vector<int>& b) {return a[0] < b[0]; // 左边界排序}int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.size() == 0) return 0;sort(intervals.begin(), intervals.end(), cmp);int res = 1; // points 不为空至少需要一支箭for (int i = 1; i < intervals.size(); i++) {if (intervals[i][0] >= intervals[i - 1][1]) {res++; // 需要一支箭}else {  // 气球i和气球i-1挨着intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]); // 更新重叠气球最小右边界}}return intervals.size() - res;}
};

leetcode 763. 划分字母区间

题目链接:划分字母区间
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了
算法分为两步:

  • 统计每一个字符最后出现的位置。
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等,则找到了分割点。
class Solution {
public:vector<int> partitionLabels(string S) {int hash[27] = {0}; //i为字符,hash[i]为字符出现的最后位置for (int i = 0; i < S.size(); i++) //统计每一个字符最后出现的位置{ hash[S[i] - 'a'] = i;}vector<int> res;int left = 0;int right = 0;for (int i = 0; i < S.size(); i++) {right = max(right, hash[S[i] - 'a']); // 找到字符出现的最远边界if (i == right) {res.push_back(right - left + 1);left = i + 1;}}return res;}
};

时间复杂度:O(n)
空间复杂度:O(1),hash数组是固定大小的。

leetcode 56. 合并区间

题目链接:合并区间
左区间排序和右区间排序都可以。

class Solution {
public:vector<vector<int>> merge(vector<vector<int>>& intervals){vector<vector<int>> res;if (intervals.size() == 0) return res; //区间集合为空直接返回//排序的参数使用了lambda表达式,采用左区间排序sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];});//第一个区间就可以放进结果集里,后面如果重叠,在res上直接合并res.push_back(intervals[0]); for (int i = 1; i < intervals.size(); i++) {if (res.back()[1] >= intervals[i][0]) //发现重叠区间,合并区间,只更新右边界,因为result.back()的左边界一定是最小值,因为按照左边界排序的{         res.back()[1] = max(res.back()[1], intervals[i][1]); } else {res.push_back(intervals[i]); //区间不重叠 }}return res;}
};

时间复杂度: O(nlogn)
空间复杂度: O(logn),排序需要的空间开销

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

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

相关文章

【自然语言处理】Transformer-XL 讲解

Transformer-XL 首先需要明确,Transformer-XL(XL 是 extra long 的简写)只是一个堆叠了自注意力层的 BPTT 语言模型,并不是 Transformer 原始论文中提到的编码器-解码器架构,也不是原始 Transformer 中的编码器部分或者解码器部分,根据其大致实现可以将其理解为丢弃 cro…

echarts 仪表盘进度条 相关配置

option {series: [{type: gauge,min: 0,//最大值max: 100, //最小值startAngle: 200,//仪表盘起始角度。圆心 正右手侧为0度&#xff0c;正上方为90度&#xff0c;正左手侧为180度。endAngle: -20,//仪表盘结束角度splitNumber: 100, //仪表盘刻度的分割段数itemStyle: {color…

深度学习|4.1 深L层神经网络 4.2 深层网络的正向传播

4.1 深L层神经网络 对于某些问题来说&#xff0c;深层神经网络相对于浅层神经网络解决该问题的效果会较好。所以问题就变成了神经网络层数的设置。 其中 n [ i ] n^{[i]} n[i]表示第i层神经节点的个数&#xff0c; w [ l ] w^{[l]} w[l]代表计算第l层所采用的权重系数&#xff…

day07 四数相加Ⅱ 赎金信 三数之和 四数之和

题目1&#xff1a;454 四数相加Ⅱ 题目链接&#xff1a;454 四数相加Ⅱ 题意 4个整数数组nums1&#xff0c; nums2&#xff0c; nums3&#xff0c; nums4的长度均为n&#xff0c;有多少个元组&#xff08;i&#xff0c;j&#xff0c;k&#xff0c;l&#xff09;使得 nums[…

Python如何生成个性二维码

Python-生成个性二维码 一、问题描述 通过调用MyQR模块来实现生成个人所需二维码。 安装&#xff1a; pip install myqr 二、代码实现 1.普通二维码 from MyQR import myqr # 普通二维码 myqr.run(wordshttp://www.csdn.net/mayi0312,save_nameqrcode.png ) 效果图&#…

@JsonFormat与@DateTimeFormat

JsonFormat注解很好的解决了后端传给前端的格式&#xff0c;我们通过使用 JsonFormat可以很好的解决&#xff1a;后台到前台时间格式保持一致的问题 其次&#xff0c;另一个问题是&#xff0c;我们在使用WEB服务的时&#xff0c;可 能会需要用到&#xff0c;传入时间给后台&am…

<软考高项备考>《论文专题 - 49 范围管理(8) 》

10 真题解析 10.1 写作思路 一、规划范围管理…【随便写&#xff0c;正常写即可】 二、收集需求…【采分点&#xff1a;重点写&#xff0c;输出是需求跟踪矩阵&#xff0c;然后需要举例需求跟踪矩阵的作用&#xff0c;结合项目进行列举说明】 例如需求跟踪矩阵的实例&#xf…

buuctf-Misc 题目解答分解109-111

109.[CFI-CTF 2018]webLogon capture 流量包分析&#xff0c; wireshark 打开 就这几个数据包&#xff0c;追踪http 进行url 解码 URL网址解码器 - 在线网址解码 得到flag CFI{1ns3cur3_l0g0n} 110.[GKCTF 2021]excel 骚操作 下载 excel 文件 &#xff0c;打开 发现点击其他地…

计算机Java项目|基于Springboot实现患者管理系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 文末获取源码 项目编号&#xff1a;KS-032…

uView Tabbar 底部导航栏

优点&#xff1a; 此组件提供了自定义tabbar的能力&#xff0c;具有如下特点&#xff1a; 图标可以使用字体图标(内置图标和扩展图标)或者图片可以动态切换菜单的数量以及配置切换菜单之前&#xff0c;可以进行回调鉴权可以设置角标或数字化提示有效防止组件区域高度塌陷&…

【Springboot】基础业务学习笔记

参数校验 方法步骤 1.引入Spring Validation起步依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>2.在参数面前添加Pattern注解 Pattern(regexp…

CanFestival结合Android来完成canopen通信

1.准备开发环境 安装Android Studio和NDK后&#xff0c;需要在Android Studio中创建一个新的NDK项目&#xff0c;并且在项目目录下创建一个jni目录来放置NDK代码。 配置CAN总线接口硬件需要根据具体的硬件要求进行&#xff0c;常见的方法包括使用串口或USB连接CAN总线接口&…

PyTorch Tutorial

本文作为博客“Transformer - Attention is all you need 论文阅读”的补充内容&#xff0c;阅读的内容来自于 https://pytorch.org/tutorials/intermediate/char_rnn_classification_tutorial.html#recommended-preparation 建议的准备流程。 Deep Learning with PyTorch: …

网络知识-以太网技术的发展及网络设备

目 录 一、背景介绍 &#xff08;一&#xff09;网络技术的时代 &#xff08;二&#xff09;以太网技术脱颖而出 二、以太网的工作原理 &#xff08;一&#xff09;、载波侦听多路访问&#xff08;CSMA/CD&#xff09; 1、数据发送流程 2、发送过程解析 3、…

np.eye()函数的使用

背景&#xff1a;今天在复现一篇3D图像分割论文的时候&#xff0c;思考了一个问题&#xff0c;我们的数据集一般由原始数据和对应的Ground Truth组成&#xff0c;一般的3D数据都是(Height,Width,Depth)的形状&#xff0c;而对应的Ground Truth也是(Height,Width,Depth)的形状。…

WeNet语音识别+Qwen-72B-Chat Bot+Sambert-Hifigan语音合成

WeNet语音识别Qwen-72B-Chat Bot&#x1f47e;Sambert-Hifigan语音合成 简介 利用 WeNet 进行语音识别&#xff0c;使用户能够通过语音输入与系统进行交互。接着&#xff0c;Qwen-72B-Chat Bot作为聊天机器人接收用户的语音输入或文本输入&#xff0c;提供响应并与用户进行对话…

RPC基础知识总结

RPC 是什么? RPC&#xff08;Remote Procedure Call&#xff09; 即远程过程调用&#xff0c;通过名字我们就能看出 RPC 关注的是远程调用而非本地调用。 为什么要 RPC &#xff1f; 因为&#xff0c;两个不同的服务器上的服务提供的方法不在一个内存空间&#xff0c;所以&am…

k8s安装hostPath方式存储的PostgreSQL15

1.配置 PostgreSQL 的 ConfigMap cat > postgres-configmap.yaml << EOF apiVersion: v1 kind: ConfigMap metadata:name: postgres-configlabels:app: postgresnamespace: dev data:POSTGRES_DB: postgresdbPOSTGRES_USER: postgresadminPOSTGRES_PASSWORD: admin12…

软件测试/测试开发丨Vuetify框架的使用

介绍 Vuetify 是一个基于 Vue.js 精心打造 UI 组件库&#xff0c;整套 UI 设计为 Material 风格。能够让没有任何设计技能的开发者创造出时尚的 Material 风格界面。 为什么要使用Vuetify框架 所有组件遵从 Material Design 设计规范&#xff0c;UI 体验非常优秀&#xff0c…

09-C++ STL-适配器、算法

c STL-适配器、算法 1. 函数对象 1.1 概念 重载函数调用操作符的类&#xff0c;其对象常称为函数对象&#xff08;function object&#xff09;&#xff0c;即它们是行为类似函数的对象&#xff0c;也叫仿函数(functor)&#xff0c; 其实就是 重载“()”操作符&#xff0c;使…