代码随想录算法训练营第三十六天 | 重叠区间

news2024/12/23 11:12:36

435. 无重叠区间

文档讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,依然是判断重叠区间 | LeetCode:435.无重叠区间_哔哩哔哩_bilibili

状态:能做出来,用的“补充(1)”的左边界排序,但想的不够透彻。

思路

**相信很多同学看到这道题目都冥冥之中感觉要排序,但是究竟是按照右边界排序,还是按照左边界排序呢?**其实都可以。主要就是为了让区间尽可能的重叠。

我来按照右边界排序,从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数就是需要移除的区间个数了

此时问题就是要求非交叉区间的最大个数。这里记录非交叉区间的个数还是有技巧的,如图:

在这里插入图片描述

区间,1,2,3,4,5,6都按照右边界排好序。当确定区间 1 和 区间2 重叠后,如何确定是否与 区间3 也重贴呢?

就是取 区间1 和 区间2 右边界的最小值,因为这个最小值之前的部分一定是 区间1 和区间2 的重合部分,如果这个最小值也触达到区间3,那么说明 区间 1,2,3都是重合的

接下来就是找大于区间1结束位置的区间,是从区间4开始。那有同学问了为什么不从区间5开始?别忘了已经是按照右边界排序的了

区间4结束之后,再找到区间6,所以一共记录非交叉区间的个数是三个。总共区间个数为6,减去非交叉区间的个数3。移除区间的最小数量就是3。

我用的左边界排序,左边界排序我们就是直接求 重叠的区间

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;
    }
};

763.划分字母区间

文档讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,寻找最远的出现位置! LeetCode:763.划分字母区间_哔哩哔哩_bilibili

状态:不会做。

思路

在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。此时前面出现过所有字母,最远也就到这个边界了。

可以分为如下两步:

  • 统计每一个字符最后出现的位置
  • 从头遍历字符,并更新字符的最远出现下标,如果找到字符最远出现位置下标和当前下标相等了,则找到了分割点

如图:

在这里插入图片描述

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> result;
        int left = 0;
        int right = 0;
        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 = i + 1;
            }
        }
        return result;
    }
};

56. 合并区间

文档讲解:代码随想录 (programmercarl.com)

视频讲解:贪心算法,合并区间有细节!LeetCode:56.合并区间_哔哩哔哩_bilibili

状态:能直接做出来。

思路

本题是判断区间重贴后要进行区间合并。所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

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

知道如何判断重复之后,剩 下的就是合并了,如何去模拟合并区间呢?其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。

class Solution {
public:
    static bool cmp(const vector<int>& a, const vector<int>& b){
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        sort(intervals.begin(), intervals.end(), cmp);  //按照左边界排序
        vector<int> tmp = intervals[0];
        vector<vector<int>> res;
        for(int i = 1; i < intervals.size(); i++){
            if(intervals[i][0] <= tmp[1]){  //如果左边界小于等于最大右边界
                tmp[1] = max(tmp[1], intervals[i][1]);
            }
            else{   //如果左边界大于最大右边界
                res.push_back(tmp);
                tmp = intervals[i];
            }
        }
        res.push_back(tmp); // 最后一个在循环中没有加入,所以这里给加入
        return res;
    }
};

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

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

相关文章

SpringCloud —— eureka

目录 1.认识微服务 1.0.学习目标 1.1.单体架构 1.2.分布式架构 1.3.微服务 1.4.SpringCloud 1.5.总结 2.服务拆分和远程调用 2.1.服务拆分原则 2.2.服务拆分示例 2.2.1.导入Sql语句 2.2.2.导入demo工程 2.3.实现远程调用案例 2.3.1.案例需求&#xff1a; 2.3.2.注…

4. Mysql索引优化实战一

一条SQL在MySQL中是如何执行的 1. 示例表举一个大家不容易理解的综合例子 本文是按照自己的理解进行笔记总结&#xff0c;如有不正确的地方&#xff0c;还望大佬多多指点纠正&#xff0c;勿喷。 本节课内容&#xff1a; 索引下推优化详解Mysql优化器索引选择探究索引优化Order…

解决winstore下载mincraft 出现错误提示的问题,以及minecraft.exe出现此应用无法在你的电脑上运行的原因分析。

mincraft 点开显示此应用无法在你的电脑上运行&#xff0c;去C:\XboxGames\Minecraft Launcher\Content下看了下&#xff1a; 但是别人电脑上相同目录下一样的文件能运行&#xff0c;于是选择重装&#xff0c;但是刚开始下载就遇到这个问题&#xff1a; 商店提示这个 点开一…

Neural Network学习笔记2

torch.nn: Containers: 神经网络骨架 Convolution Layers 卷积层 Pooling Layers 池化层 Normalization Layers 正则化层 Non-linear Activations (weighted sum, nonlinearity) 非线性激活 Convolution Layers Conv2d torch.nn.Conv2d(in_channels, out_channels, ke…

Web缓存利用分析(三)

导语&#xff1a;前一篇文章介绍了Server Cache Poisoning在实际应用场景下&#xff0c;产生DOS攻击的利用方式。本篇文章则介绍Web Cache Deception在真实场景下的应用方式和测试情况。 前言 前一篇文章介绍了Server Cache Poisoning在实际应用场景下&#xff0c;产生DOS攻击…

产品经理入门书籍有哪些?

说到入门产品经理&#xff0c;应该看哪些书籍呢&#xff1f;下面咱们就从产品经理的各种能力维度来聊聊&#xff0c;这样更有针对性。 一、夯实产品经理的基础&#xff0c;建立产品思维 首先我们入行&#xff0c;要清楚产品经理具体的工作怎么做&#xff0c;比如&#xff1a;…

分享一个造成azkaban上传文件失败的案例

背景&#xff1a; 当初由于开发的需求&#xff0c;需要将传统方式部署azkaban以容器的方案部署&#xff0c;不但可以满足业务需求&#xff0c;还可以将用于构建的azkaban ECS虚拟机空闲出来&#xff0c;用作k8s节点。 但是在构建azkaban容器实例的时候由于azkaban参数配…

Flink第三章:基本操作(二)

系列文章目录 Flink第一章:环境搭建 Flink第二章:基本操作. Flink第三章:基本操作(二) 文章目录 系列文章目录前言一、物理分区1.shuffle(随机分区)2.Round-Robin(轮询)3.rescale(重缩放分区)4.broadcast(广播)5.Custom(自定义分区) 二、Sink1.写出到文件2.写入到Kafka3.写入到…

leetcode:203.移除链表元素(两种方法详解)

前言&#xff1a;内容包括-题目&#xff0c;代码实现&#xff08;两种方法&#xff09;&#xff0c;大致思路&#xff0c;代码解读 题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 …

【CSS系列】第五章 · CSS文本属性

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

QT With OpenGL(SSAO)(Screen-Space Ambient Occlusion)

文章目录 在G_Buffer中加入深度信息使用深度信息得到环境遮蔽的结果1. 新建SSAO帧缓存类2.生成法向半球核心3. 生成随机核心转动纹理为什么要生成随机核心转动创建一个小的随机旋转向量纹理 4.使用G_Buffer渲染SSAO纹理传入参数着色器1. 获取当前像素在纹理中的信息2.计算TBN矩…

SpringBoot -- AOP

一直只听过AOP&#xff0c;但是并不知道AOP的原理使用&#xff0c;参考深入浅出SpringBoot2.x学习一下SpringBoot AOP编程 AOP是基于动态代理实现的 静态代理就是代理类中有一个实现类&#xff0c;和实现类相同名称的方法&#xff0c;调用代理的request方法&#xff0c;执行顺…

RF检测器/控制器MS2351可pin对pin兼容AD8314、MAX4003

MS2351M/MS2351D 是一款对数放大器芯片&#xff0c;主要用于接收信号强度指示 (RSSI) 与控制功率放大器&#xff0c;工作频率范围是50MHz&#xff5e;3000MHz&#xff0c;动态范围可达 35dB 到 45dB。可pin对pin兼容AD8314、MAX4003。 MS2351M/MS2351D 是电压响应器件&#xff…

【c语言】结构体详解 | 结构体数组/指针

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

【ChirpStack 】如何获取 JWT TOKEN

LoRa App Server 提供了两类 API 接口&#xff0c;其中 RESTful JSON API 提供了一个 API console&#xff0c;在AS地址的基础上使用 /api 即可访问&#xff0c;罗列了 API 端点和文档介绍&#xff0c;测试起来非常方便。 本文主要介绍 如何使用 chirpstack 的API 进行测试以及…

商户查询的缓存——基于逻辑过期方式解决缓存击穿问题

//基于逻辑过期方式解决缓存基穿问题 理论上讲都是可以命中的 public Shop queryWithLogincalExpire(Long id){ //1.从redis中查商铺缓存 String jsonShop stringRedisTemplate.opsForValue().get(CACHE_SHOP_KEY id); //2.未命中 if(StringUtils.isBlank(j…

Python程序运行中报Memoryerror的解决方案

在求解某高维时间依赖的PDE中&#xff0c;空间计算域在每一个空间方向均为M256&#xff0c;且快速算法被执行以解决储存与计算速度问题&#xff1b;而时间方向取T2000&#xff0c;时间步长0.01。 在Spyder提前运行过&#xff0c;第一次假如迭代了1468次&#xff0c;即会报Memo…

本地部署 Dolly V2

本地部署 Dolly V2 1. 什么是 Dolly V22. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 部署 Dolly V26. 编写测试程序7. 运行测试程序 1. 什么是 Dolly V2 Databricks的dolly-v2-12b&#xff0c;是一个在 Databricks 机器学习平台上训练的指令跟随型大型语言模型&#xf…

计算机图形学 | 实验七:完成摄像机类的创建

计算机图形学 | 实验七&#xff1a;完成摄像机类的创建 计算机图形学 | 实验七&#xff1a;完成摄像机类的创建摄像机/观察空间Look At 矩阵自由移动视角移动鼠标输入缩放 华中科技大学《计算机图形学》课程 MOOC地址&#xff1a;计算机图形学&#xff08;HUST&#xff09; 计…

【自然语言处理】自然语言处理 --- NLP入门指南

文章目录 一、什么是NLP二、NLP任务类型三、NLP的预处理英文 NLP 语料预处理的 6 个步骤中文 NLP 语料预处理的 4 个步骤第1步&#xff1a;收集您的数据---语料库第2步&#xff1a;清理数据 --- 文本清洗第3步&#xff1a;分词第4步&#xff1a;标准化第5步&#xff1a;特征提取…