代码随想录第36天 | 435. 无重叠区间 、 763.划分字母区间 、 56. 合并区间

一、前言:

参考文献:代码随想录

今天的主题是贪心算法中的重叠区间,就像昨天的扎气球问题,就是通过排序,然后将区间重叠起来,然后更具边界值判断这个区间是否重叠。

二、无重叠区间

1、思路:

这题的思路和昨天的思路很象,也可以说是一模一样。

(1)首先按照左边界进行排;

    static bool cmp(const vector<int> &a, const vector<int> &b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] < b[0];
    }
    sort(intervals.begin(), intervals.end(), cmp);

(2)这样排完序之后就大概是 

昨天这样的情况;

(2)然后遍历intervals数组,找出重叠的区间,如果出现重叠的区间那就把找出来,找到一个就删除++就ok了;

        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] < intervals[i - 1][1]) {
                intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]);
                wdelete++;
            }
        }

2、整体代码如下:

class Solution {
private:
    static bool cmp(const vector<int> &a, const vector<int> &b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] < b[0];
    }
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        // 这里的重叠区间与昨日的边界有一个区别
        // 就是两个边界相等时这也可看作不重叠
        sort(intervals.begin(), intervals.end(), cmp);
        int wdelete = 0;
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] < intervals[i - 1][1]) {
                intervals[i][1] = min(intervals[i - 1][1], intervals[i][1]);
                wdelete++;
            }
        }
        return wdelete;
    }
};

三、划分字母区间

1、思路:

这一题主要考查的是对数组的应用以及一个核心思想,就是需要记录最远的字母的位置即可;

(1)首先遍历字符串,然后找到每一个字母的最远的边界值;

        int hash[27] = {0}; // 统计字母最后出现的位置
        for (int i = 0; i < s.size(); i++) {
            hash[s[i] - 'a'] = i;
        }

(2)之后再次对字符串进行遍历,通过两个指针,去分割字符串,其中匹配的条件就是当i == right的时候就说明这个字符串已经到了最末尾的位置了,就可以划分了;

        int right = 0;
        int left = 0;
        vector<int> result;
        for (int i = 0; i < s.size(); i++) {
            right = max(right, hash[s[i] - 'a']); // 存放字符出现最远的边界
            if (right == i) {
                result.push_back(right - left + 1);
                left = right + 1;
            }
        }

2、整体代码如下:

class Solution {
public:
    vector<int> partitionLabels(string s) {
        int hash[27] = {0}; // 统计字母最后出现的位置
        for (int i = 0; i < s.size(); i++) {
            hash[s[i] - 'a'] = i;
        }
        int right = 0;
        int left = 0;
        vector<int> result;
        for (int i = 0; i < s.size(); i++) {
            right = max(right, hash[s[i] - 'a']); // 存放字符出现最远的边界
            if (right == i) {
                result.push_back(right - left + 1);
                left = right + 1;
            }
        }
        return result;
    }
};

四、合并区间

1、思路:

这个思路和扎气球的差不多,但是这么不是贪最小范围,而是贪最大范围;

(1)首先还是对原有的数组进行排序;

    static bool cmd(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] < b[0];
    }
        sort(intervals.begin(), intervals.end(), cmd);

 (2)然后就是设置两个边界,left和right,就设置为第一个数组的左右边界;

        int left = intervals[0][0]; // 存储左边界临时变量
        int right = intervals[0][1]; // 记住右边界的一个临时变量

(3)之后遍历数组,如果当前数组的前边界大于right,说明已经不包含了,就可以将right和left存入到数组中去了;如果包含,那么就更新right,在right和 当前数组贪一个最大的即可;

for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] > right) {
                vector<int> a = {left, right};
                result.push_back(a);
                left = intervals[i][0];
                right = intervals[i][1];
            } else {
                right = max(intervals[i][1], right);
            }
        }

(4)最后遍历完成之后,就把最后的left和right进行回收即可;

        result.push_back({left, right});

2、整体代码如下:

 

class Solution {
private:
    static bool cmd(const vector<int>& a, const vector<int>& b) {
        if (a[0] == b[0]) return a[1] < b[1];
        return a[0] < b[0];
    }
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {

        sort(intervals.begin(), intervals.end(), cmd);
        int left = intervals[0][0]; // 存储左边界临时变量
        int right = intervals[0][1]; // 记住右边界的一个临时变量
        vector<vector<int>> result;
        for (int i = 1; i < intervals.size(); i++) {
            if (intervals[i][0] > right) {
                vector<int> a = {left, right};
                result.push_back(a);
                left = intervals[i][0];
                right = intervals[i][1];
            } else {
                right = max(intervals[i][1], right);
            }
        }
        result.push_back({left, right});
        return result;
    }
};

今日学习时间:1.5小时

leave message:

We are made wise not by the recollection of our past, but by the responsibility for our future.

我们之所以明智,不是因为我们对过去的回忆,,而是因为我们对未来的责任。

 

 

 

 

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

异常处理过程和范例

目录 异常定义 异常关联 异常捕获与处理 查询 emp 数据表中工作岗位是 MANAGER 的员工信息&#xff0c;如果不存在这个员工&#xff0c;则输出“没有数据记录返回”&#xff0c;如果存在多个记录&#xff0c;则输出“返回数据记录超过一行” 更新数据表 emp 中部门编号&am…

产品推荐 | iWave 的 FPGA-IP 评估附加 FMC 卡

1、产品概述 iWave 的 FPGA-IP 评估附加 FMC 卡旨在满足 ANSI/VITA 57.1 FMC 标准。该卡支持高引脚数 &#xff08;HPC&#xff09; 和低引脚数 &#xff08;LPC&#xff09; 连接器&#xff0c;可在风冷环境中使用。FPGA-IP评估附加卡可以与市场上的大多数FPGA开发套件连接。…

LeetCode 994—— 腐烂的橘子

阅读目录 1. 题目2. 解题思路3. 代码实现 1. 题目 2. 解题思路 1.记录下初始新鲜橘子的位置到 notRotting&#xff0c;我们按照行把二维数组拉成一维&#xff0c;所以&#xff0c;一个vector 就可以实现了&#xff1b;2.如果没有新鲜橘子&#xff0c;那么第 0 分钟所有橘子已经…

44-技术演进(下):软件架构和应用生命周期技术演进之路

应用、系统资源、应用生命周期管理这 3 个维度&#xff0c;构成了我们对云的所有诉求。 我会介绍下应用维度和应用生命周期管理维度的技术演进。 我们就先来看下软件架构的演进之路。 软件架构的演进 软件架构技术演进如下图所示&#xff1a; 单体架构 在单体架构中&#xff…

浅聊java集合框架中的java.util.LinkedList

java集合框架总览 Java集合框架是一个用来代表和操纵集合的统一架构&#xff0c;它为管理和组织对象的集合提供了一组类和接口。这个框架包含三个主要部分&#xff1a;接口、实现和算法。 接口&#xff1a; Collection&#xff1a;这是集合框架的根接口&#xff0c;定义了集…

vue 上传视频

controlslist 属性可以用于告诉浏览器在视频播放过程中应该显示哪些默认的用户界面控件 代码&#xff1a; <template><div class"schematicDiagramIndex"><el-container><el-header v-if"this.radiooCar1"><el-button click&qu…

【精选】发布应用到应用商店的基本介绍

摘要 本文旨在介绍如何在各大应用商店发布应用&#xff0c;包括市场选择、准备材料、上架步骤以及常见被拒原因及解决方法。通过详细的步骤和经验分享&#xff0c;帮助开发者顺利将应用推向市场。 引言 随着移动应用市场的不断发展&#xff0c;越来越多的开发者希望将他们的…

如何关闭WordPress的自动更新功能

Wordpress为什么自动更新 WordPress自动更新是为了提供更好的安全性和稳定性。 安全性&#xff1a;WordPress是一个广泛使用的内容管理系统&#xff0c;因此成为恶意攻击的目标。WordPress的自动更新功能确保你的网站及时获得最新的安全补丁和修复程序&#xff0c;以保护你的网…

自动化测试selenium(1)

目录 什么是自动化测试 自动化测试 单元测试 接口测试 UI自动化测试 适合做自动化测试的项目 如何实施自动化测试 自动化测试需要了解的技能 selenium介绍 特性 原理 什么是自动化测试 自动化测试 自动化测试是指软件测试的自动化, 在预设状态下运行应用程序或者系…

标准 I/O 库

直接使用系统调用的缺点&#xff1a; (1) 影响系统性能 系统调用比普通函数调用开销大 因为&#xff0c;频繁的系统调用要进行用户空间和内核空间的切换 (2) 系统调用一次所能读写的数据量大小&#xff0c;受硬件的限制 解决方案&#xff1a;使用带缓冲功能的标准I/O库&#x…

RocketMQ笔记(七)SpringBoot整合RocketMQ发送事务消息

目录 一、简介1.1、流程图1.2、事务消息流程介绍 二、Maven依赖三、生产者3.1、application配置3.2、员工表3.3、实体3.4、持久层3.5、监听器 四、测试4.1、普通消息4.2、事务消息4.2.1、消费者4.2.2、正常提交4.2.3、异常提交 五、其他5.1、接口说明5.2、checkLocalTransactio…

智能传真机触摸屏中应用的触摸感应芯片

智能传真机是应用扫描和光电变换技术&#xff0c;把文件、图表、照片等静止图像转换成电信号&#xff0c;传送到接收端&#xff0c;以记录形式进行复制的通信设备。智能传真机将需发送的原件按照规定的顺序&#xff0c;通过光学扫描系统分解成许多微小单元&#xff08;称为像素…

AXS4110 单节锂电池保护芯片 爱协生 兼容XB6042/CM1124 低成本

概述 AXS4110系列产品是一种针对锂离子或聚合物电池保护的高集成解决方案芯片。AXS4110系列包含先进的功率MOSFET、高精度电压检测电路和延时电路。AXS4110系列采用DFN1x1x0.37_4封装&#xff0c;使其成为小体积电池保护的理想解决方案。 AXS4110具有过充、过放、过流、0V充电…

SpirngBoot开发常用知识

springboot开发常用知识 命令行打包SpringBoot打包插件window端口命令临时属性设置热部署启动热部署热部署范围 常用计量单位数据校验加载测试的专用属性Web环境模拟测试如何发送虚拟请求业务层测试回滚随机产生测试用例内置数据源 命令行打包 对SpringBoot项目进行打包命令行…

液冷是大模型对算力需求的必然选择?|英伟达 GTC 2024六大亮点

在这个以高性能计算和大模型推动未来通用人工智能时代&#xff0c;算力已成为科技发展的隐形支柱。本文将重点探讨算力的演进&#xff0c;深入分析在不同领域中算力如何成为推动进步的基石&#xff1b;着眼于液冷如何突破算力瓶颈成为引领未来的先锋&#xff0c;对液冷散热的三…

智慧城市中的物联网革命——青创智通

工业物联网解决方案-工业IOT-青创智通 得益于物联网 (IoT)的变革力量&#xff0c;智慧城市的概念正在迅速成为现实。物联网正在从根本上改变城市的运作方式&#xff0c;为城市居民带来更高的效率、可持续性和生活质量。在本文中&#xff0c;我们将探讨物联网在智慧城市中的作用…

小程序商城免费搭建之java商城 电子商务Spring Cloud+Spring Boot+二次开发+mybatis+MQ+VR全景

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

面对DDOS攻击,有哪些解决办法

随着互联网带宽的持续增长以及DDOS黑客技术的发展&#xff0c;DDOS拒绝服务攻击的实施变得愈发容易。商业竞争、打击报复、网络敲诈等多种因素&#xff0c;各行各业的用户都曾受到DDOS攻击的威胁。 一旦遭受到DDOS攻击&#xff0c;随之而来的就是业务宕机&#xff0c;用户无法…

【必看】网络安全从业者书单推荐

推荐几本网络安全从业者必读的书籍 一、计算机基础 《网络硬件设备完全技术宝典》&#xff08;第3版&#xff09; 本书共768页&#xff0c;包括交换机、路由器、安全设备、网络设备等重要和常用的网络设备&#xff0c;图文并茂&#xff0c;语言流畅&#xff0c;内容及其丰富…

NL2SQL基础系列(2):主流大模型与微调方法精选集,Text2SQL经典算法技术回顾七年发展脉络梳理

NL2SQL基础系列(2)&#xff1a;主流大模型与微调方法精选集&#xff0c;Text2SQL经典算法技术回顾七年发展脉络梳理 Text-to-SQL&#xff08;或者Text2SQL&#xff09;&#xff0c;顾名思义就是把文本转化为SQL语言&#xff0c;更学术一点的定义是&#xff1a;把数据库领域下的…