代码随想录算法训练营第三十六天 | 435.无重叠区间、763.划分字母区间、56.合并区间

news2025/1/10 3:16:32

435.无重叠区间

题目链接:435.无重叠区间

给定一个区间的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除区间的最小数量,使剩余区间互不重叠

文章讲解/视频讲解:https://programmercarl.com/0435.%E6%97%A0%E9%87%8D%E5%8F%A0%E5%8C%BA%E9%97%B4.html

思路

贪心的思路如下图所示,首先按照右边界对区间进行排序。然后从左向右记录非交叉区间。

在这里插入图片描述

如上图,区间1、2、3重合,在移除时,需要移除区间2和区间3,保留右边界最小的区间1。因为非交叉
区间是按照右边界来判断的,只要一个区间的左边界小于一个非交叉区间的最小右边界,那么这个区间
就属于这个非交叉区间。上一句话的前提是这个区间和非交叉区间中的其他区间连续,例如,如果区间5
的左边界小于区间1的右边界,依然不能划入第一个非重合区间中。

反之,如果一个区间不属于这个非交叉区间,那么这个区间要么左边界大于等于这个非交叉区间的最小
右边界,要么这个区间在下一个非交叉区间中要被移除。对于第二种情况,设想一下区间5的左边界小于
区间1的右边界,区间5属于第二个非交叉区间,这时,因为区间5的右边界大于区间4的右边界,需要保
留的是区间4,区间5会被剔除。因此,我们可以放心地保留非交叉区间种右边界最小的区间(即非交叉
区间中的第一个区间),这个区间与后续的剔除后的区间一定不重叠。

如果是按照左边界对区间进行排序,那就需要从右往左记录非交叉区间了。

排序的时候,用数据的引用,而不是直接传形参。这样会快很多。

C++实现

class Solution {
public:
    int eraseOverlapIntervals(vector<vector<int>>& intervals) {
        if(intervals.size() == 0) return 0;
        auto cmp = [](const vector<int>& a,const vector<int>& b){return a[1] < b[1];};
        sort(intervals.begin(), intervals.end(), cmp);
        int count = 1;
        int minRight = intervals[0][1];
        for(int i = 1;i<intervals.size();i++){
            if(intervals[i][0] >= minRight){
                minRight = intervals[i][1];
                count++;
            }
        }
        return intervals.size() - count;
    }
};

763.划分字母区间

题目链接:763.划分字母区间

给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。

注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s

返回一个表示每个字符串片段的长度的列表。

文章讲解/视频讲解:https://programmercarl.com/0763.%E5%88%92%E5%88%86%E5%AD%97%E6%AF%8D%E5%8C%BA%E9%97%B4.html

思路

第一遍遍历,用一个哈希表hash来记录下每个字母出现的次数。

第二遍遍历,每遍历一位字母,判断一下当前区间中的字母是否还剩余,比如对于字母a,用hash[‘a’]减
去已经遍历到的字母a的个数,如果等于0,说明所有字母a都已经遍历完了。如果对于当前区间中的所有
字母,都没有剩余了,那就可以进入下一个区间。

需要对tmpHash做一下clear操作。

也可以统计一下每一个字符最后出现的位置,然后在遍历的过程中,如果当前遍历到了当前区间内字符
中最后出现的位置,则找到了一个划分位置。

C++实现

// 原本写法
class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> hashSet(26, 0);
        for(int i = 0;i<s.size();i++){
            hashSet[s[i] - 'a']++;
        }
        vector<int> results;
        vector<int> tmpHash(26, 0);
        for(int i = 0;i<s.size();i++){
            tmpHash[s[i] - 'a'] += 1;

            bool finished = true;
            int sum = 0;
            for(int j = 0;j<tmpHash.size();j++){
                if(tmpHash[j] != 0 && tmpHash[j] != hashSet[j]){
                    finished = false;
                }
                sum += tmpHash[j];
            }
            if(finished){
                tmpHash.clear();
                tmpHash.resize(26, 0);
                results.push_back(sum);
            }
        }

        return results;
    }
};

// 统计字符最后出现的位置
class Solution {
public:
    vector<int> partitionLabels(string s) {
        vector<int> hashSet(26, 0);
        for(int i = 0;i<s.size();i++){
            hashSet[s[i] - 'a'] = i;
        }
        vector<int> results;

        int maxEnd = 0;
        int left = 0;
        for(int i = 0;i<s.size();i++){
            maxEnd = max(maxEnd, hashSet[s[i] - 'a']);
            if(maxEnd == i){
                results.push_back(i - left + 1);
                left = i + 1;
            }
        }

        return results;
    }
};

56. 合并区间

题目链接:56. 合并区间

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

文章讲解/视频讲解:https://programmercarl.com/0056.%E5%90%88%E5%B9%B6%E5%8C%BA%E9%97%B4.html

思路

首先,对区间进行排序。如果有重叠区间,那么它们一定是连续的。

然后对每个区间进行遍历,每一次遍历的过程中,对区间取并集,如果当前区间不在之前的并集中,则
记录下并集区间,再开一个新的并集。与之前的无重叠区间相比,无重叠区间相当于在找交集。

C++实现

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        auto cmp = [](const vector<int>& a, const vector<int>& b){return a[0] == b[0] ? a[1] < b[1] : a[0] < b[0];};
        sort(intervals.begin(), intervals.end(), cmp);
        vector<vector<int>> results;

        int left = intervals[0][0];
        int maxRight = intervals[0][1];
        for(int i = 1;i<intervals.size();i++){
            if(intervals[i][0] <= maxRight){
                maxRight = max(maxRight, intervals[i][1]);
            }
            else{
                results.push_back({left, maxRight});
                left = intervals[i][0];
                maxRight = intervals[i][1];
            }
        }
        results.push_back({left, maxRight});
        return results;
    }
};

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

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

相关文章

Git学习笔记(第2章):Git安装

官网地址&#xff1a;Githttps://git-scm.com/ Step1&#xff1a;查看Git的GNU协议 → 点击“Next” Step2&#xff1a;设置Git的安装位置(非中文、无空格的目录) → 点击“Next” Step3&#xff1a;选择Git的选项配置(推荐默认设置) → 点击“Next” Step4&#xff1a;设置Git…

What is `addFormattersdoes` in `WebMvcConfigurer` ?

addFormatters 方法在SpringMVC框架中主要用于向Spring容器注册自定义的格式化器&#xff08;Formatter&#xff09; SpringMVC内置了一系列的标准格式化器&#xff0c;用于处理日期、数字和其他常见类型的转换。 开发者也可以通过实现 WebMvcConfigurer 接口&#xff0c;并重写…

笔记本电脑如何连接显示屏?

目录 1.按下快捷键 winP,选择扩展 2.连接显示器&#xff0c;连好接线 3.笔记本驱动有问题&#xff0c;显示错误如下&#xff1a; 4.驱动已经下载完成&#xff0c; 按下快捷键&#xff0c;还是显示第3步中的错误 5.驱动已经下载完成&#xff0c; 按下快捷键&#xff0c;参照…

Page268~270 11.3.4 wxWidgets项目配置

项目w28_gui的项目配置&#xff1a; 一&#xff0c;编译选项&#xff0c; -pipe -mthreads [[if (GetCompilerFactory().GetCompilerVersionString(_T("gcc")) > _T("4.8.0")) print(_T("-Wno-unused-local-typedefs"));]] 1, -pipe&#…

京东获得JD商品详情 API (jd.item_get):电商发展中的中重要性

数据整合与同步&#xff1a;对于许多电商企业来说&#xff0c;商品数据的管理是一个重要的环节。通过JD商品详情API&#xff0c;商家可以方便地获取京东平台上的商品详情&#xff0c;实现数据的整合与同步。这有助于确保商品信息的准确性&#xff0c;提高库存管理和订单处理的效…

前端react入门day04-useEffect与Hook函数

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 useEffect 的使用 useEffect 的概念理解 useEffect 依赖项参数说明 useEffect — 清除副作用 自定义Ho…

新数智空间:阿里云边缘云持续保持中国公有云市场第一

全球领先的 IT 市场研究和咨询公司 IDC 发布 《中国边缘云市场解读&#xff08;2023H1&#xff09;》报告 中国边缘公有云服务市场 阿里云持续第一 稳居市场第一&#xff0c;“边缘”逆势生长 近日&#xff0c;全球领先的 IT 市场研究和咨询公司 IDC 最新发布《中国边缘云市…

通信入门系列——信号的频谱分析

一、信号频谱 信号的频谱&#xff0c;指的是一段频率范围内的情况&#xff0c;信号的幅度和相位的情况。 以一个频率为1Hz的余弦电压信号进行说明&#xff0c;这个信号的傅里叶变换为X(ω)πδ(ω-2π)πδ(ω2π)&#xff0c;也就是所谓的频谱密度&#xff0c;单位为V/(rad/…

Manjora 中使用idm,linux通用

说明 在Mnajora中的idm需要在wine中运行&#xff0c;idm是一款很不错的下载工具&#xff0c;但是在linux不能直接使用&#xff0c;借助wine也无法使用浏览器的集成插件&#xff0c;在网上偶然发现一款第三方插件能够在linux的浏览器中将链接捕捉到idm中&#xff0c;虽然使用起…

Java的便捷输入方法及解析

在 Java 中&#xff0c;有多种便捷的输入方法可以从用户那里获取输入。下面是一些常见的便捷输入方法及解析&#xff1a; 使用 Scanner 类&#xff1a;在上述示例中&#xff0c;首先导入了 java.util.Scanner 类&#xff0c;创建了一个 Scanner 对象&#xff0c;并使用 System…

PXE批量高效网络装机

总结 1实验流程只能抄老师&#xff0c;记忆浅 2排错能力几乎无 3 指令用的太死&#xff0c; 一 系统装机的三种引导方式 启动 操作 系统 1.硬盘 2.光驱&#xff08;u盘&#xff09; 3.网络启动 pxe 重装系统&#xff1f; 在已有操作系统 新到货了一台服务器&#xff…

【数据结构】二叉树(遍历,递归)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​​ 目录 二叉树遍历规则 前序遍历 ​…

数组练习 Leetcode 566.重塑矩阵

在 MATLAB 中&#xff0c;有一个非常有用的函数 reshape &#xff0c;它可以将一个 m x n 矩阵重塑为另一个大小不同&#xff08;r x c&#xff09;的新矩阵&#xff0c;但保留其原始数据。 给你一个由二维数组 mat 表示的 m x n 矩阵&#xff0c;以及两个正整数 r 和 c &#…

使用docker部署RStudio容器并结合内网穿透实现公网访问

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE&#xff0c;并通过 Web 浏览器进行访问…

Java多线程并发篇----第二十一篇

系列文章目录 文章目录 系列文章目录前言一、Java 中的阻塞队列二、ArrayBlockingQueue(公平、非公平)三、LinkedBlockingQueue(两个独立锁提高并发)四、PriorityBlockingQueue(compareTo 排序实现优先)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默…

瑞_Java开发手册_(六)工程结构

文章目录 工程结构的意义(一) 应用分层(二) 二方库依赖(三) 服务器 &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的工程结构篇&#xff0c;主要介绍应用分层、二方库依赖、服务器。由于博主是从阿里的《Java开发手册》学习到Java的编程规约&#xff0c…

44.5K Star,简单易用自动化运维监控工具

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 今天介绍一个开源的自动化运维监控工具&#xff0c;它是一个轻量的开源…

【Vue3】2-13 : 章节总结

本书目录&#xff1a;点击进入 一、总结内容 二、习题 2.1 【选择题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; 2.2 【编程题】以下Vue指令中&#xff0c;哪些指令具备简写方式&#xff1f; &#xff1e; 效果 &#xff1e; 代码 一、总结内容 了解核…

使用C#操作文件:一个实际案例——替换文件中的IP地址

标题&#xff1a; 使用C#操作文件&#xff1a;一个实际案例——替换文件中的IP地址 介绍&#xff1a; 欢迎阅读我的最新博客&#xff01;今天&#xff0c;我们将探讨如何使用C#来处理一个实际的编程挑战&#xff1a;读取一个配置文件并替换其中的IP地址。这是一个非常常见的…

【NCRE 二级Java语言程序设计04】二级Java考试应用软件使用

目录 前言一、软件介绍和下载1.软件介绍和下载2.下载软件3.下载使用说明和示例教程 二、本地练习环境搭建1.解压启动2.自建Java应用程序3.Hello入门程序 三、NetBeans一般配置1.代码模板2.字体和颜色3.快捷键映射 总结 前言 &#x1f4dc;本专栏主要是分享自己备考全国计算机二…