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

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.mfbz.cn/a/331286.html

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

相关文章

Java毕业设计-基于jsp+servlet的家用电器购物商城管理系统-第87期

获取源码资料&#xff0c;请移步从戎源码网&#xff1a;从戎源码网_专业的计算机毕业设计网站 项目介绍 基于jspservlet的家用电器购物商城管理系统&#xff1a;前端 jsp、jquery、layui&#xff0c;后端 servlet、jdbc&#xff0c;角色分为管理员、用户&#xff1b;集成商品…

AI制作《流浪地球3》高清宣传片

AI制作《流浪地球3》高清宣传片 星辰大海&#xff0c;再次启航&#xff0c;人类的冒险&#xff0c;永无止境。The vast expanse of stars and oceans, setting sail once again. Human adventure knows no bounds. 当家园变得遥不可及&#xff0c;我们唯有勇往直前。With our …

电脑端网络记事本哪个安全稳定?

随着互联网科技的飞速发展&#xff0c;越来越多的上班族发现在电脑上使用网络记事本的重要性。这种网络记事本不仅便于记录工作内容&#xff0c;而且自动将数据上传到云端进行备份&#xff0c;让用户不再为数据丢失而担忧。让我们来看看上班族使用网络记事本的好处。 在日常工…

阿里云服务器地域如何选择?哪个地域价格优惠一些?

阿里云服务器地域和可用区怎么选择&#xff1f;地域是指云服务器所在物理数据中心的位置&#xff0c;地域选择就近选择&#xff0c;访客距离地域所在城市越近网络延迟越低&#xff0c;速度就越快&#xff1b;可用区是指同一个地域下&#xff0c;网络和电力相互独立的区域&#…

一文了解GeoTrust SSL证书

在当今互联网的高度连接世界中&#xff0c;确保网站安全性至关重要。SSL证书是保护网站和用户数据的关键组成部分。GeoTrust证书在SSL证书市场上享有盛誉&#xff0c;被许多网站所有者和企业所信赖。JoySSL将深入探讨GeoTrust证书的特点&#xff0c;帮助大家了解该品牌并做出更…

Spring中动态注册和销毁对象

1. 使用说明 通常我们项目中想要往spring容器中注入一个bean可以在项目初始化的时候结合Bean注解实现。但是该方法适合项目初始化时候使用&#xff0c;如果后续想要继续注入对象则无可奈何。本文主要描述一种在后续往spring容器注入bean的方法。 2. 实现 2.1 说明 2.1.1 注册…

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&#…

spark dateformat源码排错

背景 有一个任务 yyyy写成了YYYY&#xff0c;导致年份不对触发告警 select from_unixtime(unix_timestamp(),YYYY-MM-dd HH:mm:ss) 第一时间用spark dateformat搜索下看看官网&#xff0c;发现spark 官网也没有描述YYYY的信息 Datetime patterns - Spark 3.5.0 Documentati…

【计算机组成与体系结构Ⅱ】Cache性能分析(实验)

实验6&#xff1a;Cache性能分析 一、实验目的 1&#xff1a;加深对 Cache 的基本概念、基本组织结构以及基本工作原理的理解。 2&#xff1a;掌握 Cache 容量、相联度、块大小对 Cache 性能的影响。 3&#xff1a;掌握降低 Cache 不命中率的各种方法以及这些方法对提高 Ca…

Springboot智慧校园电子班牌统一管理平台源码

借助AIoT智能物联、云计算技术打造智慧绿色校园&#xff0c;助力实现校园教务管理、教师管理、学籍管理、考勤、信息发布、班级文明建设、校园风采、家校互通等场景功能&#xff0c;打造安全、便捷、绿色的智慧校园。 前后端分离架构 1、使用springbootvue2 2、数据库&#xff…

Day31 46全排列 47全排列II 回溯去重tips 51N皇后 37解数独

46 全排列 给定一个 没有重复 数字的序列&#xff0c;返回其所有可能的全排列。 示例: 输入: [1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 排列问题与组合问题的不同之处就在于&#xff0c;没有startIndex&#xff0c;同时需要设置一个used数组…

剩余电流继电器装在哪里?电工必备知识

可实时监测和显示TN-S、TT系统配电线路的剩余电流&#xff1b; 每只剩余电流监测仪最多可监测16个回路的剩余电流&#xff0c;剩余电流监测范围为1mA-30A&#xff1b; 每路剩余电流监测均可设置报警值&#xff0c;报警值的设置范围为5mA-30A。每路剩余电流监测可设置为超值…

Docker(一)简介和基本概念

一、简介 本章将带领你进入 Docker 的世界。 什么是 Docker&#xff1f; 用它会带来什么样的好处&#xff1f; 好吧&#xff0c;让我们带着问题开始这神奇之旅。 1.什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目&…

Joern环境的安装(Windows版)

Joern环境的安装(Windows版) 网上很少有关于Windows下安装Joern的教程&#xff0c;而我最初使用也是装在Ubuntu虚拟机中&#xff0c;这样使用很占内存&#xff0c;影响体验感。在Windows下使用源码安装Joern也是非常简单的过程&#xff1a; 提前需要的本地环境&#xff1a; …

基于YOLOv8深度学习的智能肺炎诊断系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

图像处理中,采用极线约束准则来约束特征点匹配搜索空间,理论上在极线上进行搜索。这里的极线是什么线,怎么定义的?基本矩阵F和本质矩阵E有什么区别?

问题描述&#xff1a;图像处理中&#xff0c;采用极线约束准则来约束特征点匹配搜索空间&#xff0c;理论上在极线上进行搜索。这里的极线是什么线&#xff0c;怎么定义的&#xff1f;基本矩阵F和本质矩阵E有什么区别&#xff1f; 问题1解答&#xff1a; 极线是通过极线几何学…

多特征变量序列预测-模型代码全家桶

包括代码、文献、文件解读&#xff01;&#xff01;&#xff01; 包括多特征变量序列预处理的代码&#xff0c; 预测效果好&#xff01;&#xff01;&#xff01;性能优越 包括 完整的风速数据集&#xff0c; 以及已经生成制作好的数据集、标签&#xff0c;对应代码均可以运行…

冻结Prompt微调LM: T5 PET (a)

T5 paper: 2019.10 Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer Task: Everything Prompt: 前缀式人工prompt Model: Encoder-Decoder Take Away: 加入前缀Prompt&#xff0c;所有NLP任务都可以转化为文本生成任务 T5论文的初衷如…

力扣刷MySQL-第四弹(详细讲解)

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;力扣刷题讲解-MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出…

GPT应用程序的上线流程

将GPT应用程序上线涉及多个步骤&#xff0c;包括开发、测试、部署和发布。以下是一般的上线流程&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 开发和测试&#xff1a; 在开发阶段&#xff0c;确保您…
最新文章