算法训练营第三十六天||● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

news2024/11/23 23:51:55

● 435. 无重叠区间

解法1:

本题其实和452.用最少数量的箭引爆气球 (opens new window)非常像,弓箭的数量就相当于是非交叉区间的数量,只要把弓箭那道题目代码里射爆气球的判断条件加个等号(认为[0,1][1,2]不是相邻区间),然后用总区间数减去弓箭数量 就是要移除的区间数量了。

class Solution {
public:
    static bool cmd(vector<int>& v1,vector<int>& v2){
        return v1[0]<v2[0];//左边界排序
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmd);
        int result = 1;
        for(int i = 1;i<intervals.size();i++){
            if(intervals[i][0] >= intervals[i-1][1]){
                result++;
            }else{
                intervals[i][1] = min(intervals[i][1],intervals[i-1][1]);
            }
        }
        return  intervals.size() - result;
    }
};

解法二:

按左边界排序,然后记录重叠数量

class Solution {
public:
    static bool cmd(vector<int>& v1,vector<int>& v2){
        return v1[0]<v2[0];//左边界排序
    }
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmd);
        int count = 0;//记录重叠区间
        for(int i = 1;i<intervals.size();i++){
            if(intervals[i][0]<intervals[i-1][1]){//重叠了
                count++;
                intervals[i][1] = min(intervals[i][1],intervals[i-1][1]);
            }
        }
        return  count;
    }
};

● 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;
        }
        int left = 0,right = 0;
        vector<int> result;
        for(int i = 0;i<s.size();i++){
            right = max(right,hash[s[i]-'a']);// 找到字符出现的最远边界
            if(i == right){
                result.push_back(right - left + 1);
                left = right + 1;
            }
        }
        return result;
    }
};

● 56. 合并区间

本题的本质其实还是判断重叠区间问题。

大家如果认真做题的话,话发现和我们刚刚讲过的452. 用最少数量的箭引爆气球 (opens new window)和 435. 无重叠区间 (opens new window)都是一个套路。

这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。

所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

按照左边界从小到大排序之后,如果 intervals[i][0] <= intervals[i - 1][1] 即intervals[i]的左边界 <= intervals[i - 1]的右边界,则一定有重叠。(本题相邻区间也算重贴,所以是<=)

这么说有点抽象,看图:(注意图中区间都是按照左边界排序之后了

知道如何判断重复之后,剩下的就是合并了,如何去模拟合并区间呢?

其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。

 

class Solution {
public:
    static bool cmd(const vector<int>& v1,const vector<int>& v2){
        return v1[0]<v2[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(),intervals.end(),cmd);
        vector<vector<int>> result;
        result.push_back(intervals[0]);
        for(int i = 1;i<intervals.size();i++){
            if(intervals[i][0]<=result.back()[1]){//区间重叠了需要合并
                result.back()[1] = max(intervals[i][1],result.back()[1]);
            }else{//区间没有重叠,直接插入
                result.push_back(intervals[i]);
            }
        }
        return result;
    }
};

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

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

相关文章

【嵌入式Qt开发入门】Qt如何网络编程——获取本机的网络信息

Qt 网络模块为我们提供了编写TCP/IP客户端和服务器的类。它提供了较低级别的类&#xff0c;例如代表低级网络概念的 QTcpSocket&#xff0c;QTcpServer 和 QUdpSocket&#xff0c;以及诸如 QNetworkRequest&#xff0c; QNetworkReply 和 QNetworkAccessManager 之类的高级类来…

2023世界人工智能大会,和鲸科技入选中国信通院《2023大模型和AIGC产业图谱》

近日&#xff0c;2023 世界人工智能大会&#xff08;WAIC&#xff09;“聚焦大模型时代 AIGC 新浪潮”论坛上&#xff0c;中国信息通信研究院&#xff08;以下简称“中国信通院”&#xff09;正式发布《2023 大模型和AIGC产业图谱》&#xff08;以下称“图谱”&#xff09;。和…

一、简易搭建本地CAS服务端

CAS服务端war包下载 https://repo1.maven.org/maven2/org/apereo/cas/cas-server-webapp-tomcat/5.3.14/ 可使用迅雷下载cas-server-webapp-tomcat-5.3.14.war &#xff0c;速度很快 将wab包放到本地tomcat的webapps下D:\tomcat\apache-tomcat-8.5.63\webapps\cas\WEB-INF\clas…

springboot项目实战-API接口限流

1.简介 对接口限流的目的是通过对并发访问/请求进行限速&#xff0c;或者对一个时间窗口内的请求进行限速来保护系统&#xff0c;一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。 1.1.为什么需要限流? 大量正常用户高频访问导致服务器宕机恶意用户高频访问导致服…

国产SAAS平台中类似Jira的有哪些值得关注的选择?

在项目管理市场中&#xff0c;Jira是一款非常知名的软件工具。它可以帮助团队成员更好地管理和协作&#xff0c;提高项目效率和质量。然而&#xff0c;Jira并不是完美的&#xff0c;存在诸如复杂操作、高昂费用等不足之处。因此&#xff0c;许多国内企业开始尝试寻找替代品&…

Yolov7配置CoCo精度显示问题实操

1、安装pycocotools工具&#xff0c; 使用yolov7项目中test.py&#xff0c;安装pycocotools时&#xff0c;命令无法直接安装成功。 本次操作在Linux上进行&#xff1a; GitHub - cocodataset/cocoapi: COCO API - Dataset http://cocodataset.org/COCO API - Dataset http:…

uniapp 打包安卓apk (原生App)云打包

uniapp 打包安卓apk (原生App)云打包 hbuilder中操作 项目的一些配置appid DCloud appid 用途/作用/使用说明&#xff1a; https://ask.dcloud.net.cn/article/35907 右键我们项目目录-》发行-》原生APP-云打包 说明&#xff1a; 1. 打包安卓&#xff0c;只选择安卓打包项&…

【Pytest】Allure测试报告的安装与环境配置

文章目录 一、安装配置JAVA环境1、下载jdk2、配置环境变量3、检验 二、安装allure-pytest插件三、下载安装Allure1、下载allure2、配置环境变量3、检验 一、安装配置JAVA环境 Allure基于Java开发&#xff0c;因此需要提前安装Java 8 或以上版本的环境。 1、下载jdk jdk下载地…

2023愚人杯-easy_base

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 4C455A5645334C44474A55484D5A42544F5132574956525A50464E464F4E4C474D4656454D334359474A554751564B4949493255535532464E42544643504A350x02 Write Up 直接通过现成的工具即可&#xff1a; 以上

C++教程——STL

STL基本概念 容器算法迭代器 Vector容器 vector存放内置数据类型 vector存放自定义数据类型 vector容器嵌套容器 string容器 string的构造函数 string赋值操作 string字符串拼接 string查找与替换 string字符串比较 string字符存取 string插入与删除 string字串获取

React+Antd+Typescript:封装条件查询组件

文章目录 概要整体架构思路概要 这是筛选组件的效果图。一般使用场景,根据需求快速筛选出符合条件的数据。 那么这个筛选组件,就是默认一些常见的条件,比如明天或者昨天,虽然这个条件,我们可以通过antd的日期控件来实现,但缺点就是操作起来有点麻烦。通过预设一些条件,…

学习记录——BiSeNetV1、BiSeNetV2、BiSeNetV3、PIDNet

BiSeNetV1 BiSeNetV1为了在不影响速度的情况下&#xff0c;同时收集到空间信息和语义信息&#xff0c;设计了两条路&#xff1a; Spatial Path: 用了三层stride为 2 的卷积&#xff0c;卷积BNRELU模块。最后提取了相当于原图像 1/8 的输出特征图。由于它利用了较大尺度的特征图…

C++_简单模拟实现string的增删查改

目录 一、模拟reserve 二、模拟push_back 三、模拟append 四、模拟operator 五、模拟insert 六、模拟erase 七、模拟find 八、模拟substr 一、模拟reserve 要添加数据&#xff0c;首先要考虑的是扩容。有必要用reserve辅助扩容。reserve的作用就是给一个预期的值作为扩…

【雕爷学编程】Arduino动手做(138)---64位WS2812点阵屏模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

Vue源码分析拓展 - 响应式系统搭建

Vue里面如何追踪变化 当你把一个普通的JavaScript对象传入Vue实例作为data选项&#xff0c;Vue将遍历此对象所有的属性&#xff0c;并使用Object.defineProperty把这些属性全部转为getter/setter. 这些getter/setter.对用户来说是不可见的&#xff0c;但是在内部他们让Vue能够…

Nginx配置汇总

一、Nginx概念 Nginx是目前负载均衡技术中的主流方案&#xff0c;几乎绝大部分项目都会使用它&#xff0c;Nginx是一个轻量级的高性能HTTP反向代理服务器&#xff0c;同时它也是一个通用类型的代理服务器&#xff0c;支持绝大部分协议&#xff0c;如TCP、UDP、SMTP、HTTPS等。…

Java028——Runtime 类

一、Runtime 类介绍 Runtime 类是JDK 提供的运行时类&#xff0c;该类为 Java 程序提供了与当前运行环境相连接的一个通道,Java 程序可以利用该类对当前的运行环境执行一些简单的操作。 二、Runtime 对象的创建 Runtime 类对象不能使用 new 关键字创建&#xff0c;只能通过 …

【LeetCode: 167. 两数之和 II - 输入有序数组 | 双指针专题 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

C++之final关键字用法(一百六十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Loki+promtail+Grafana监控docker容器日志

目标&#xff1a;监控docker容器的日志&#xff0c;适用于生成环境 效果&#xff1a; 需要的工具&#xff1a;Loki&#xff0c;promtail&#xff0c;Grafana 通过安装promtail容器收集日志&#xff0c;并把日志发送给loki存储处理&#xff0c;由Grafana展示日志。 参考官网的…