【算法练习Day30】无重叠区间 划分字母区间合并区间

news2024/9/23 23:25:15

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

  • 无重叠区间
  • 划分字母区间
  • 合并区间
  • 总结:

今天的三道题都是重叠区间的题,也是代码简单但思路难想,其中第二题不太算贪心,但是也能贪心写出来,但是这里不给贪心代码,因为挺难写的。

无重叠区间

435. 无重叠区间 - 力扣(LeetCode)
在这里插入图片描述

这道题是让我们返回要删除几个区间才能达到该数组内部,不再出现重叠区间了,其实并不需要进行真正的删除区间模拟,因为我们只需要返回要删除区间的个数,并不是要真的在数组里直接删除。

应该按照左边界排序还是右边界排序呢?其实理论上来说,都是可行的,但是左边界排序不好理解,我们采用对右边界从小到大排序,然后正向的遍历数组。由于我们排完序将右边界小的值排在了前面,所以我们可以按照先找非重叠的部分有几个,然后用总数减去非重叠就得到了我们要删除几个区间,直接求要删除的重叠区间个数是十分困难的。

我们排完序的第一个区间一定是右区间最小的,我们以它开始,寻找一个区间满足左区间大于或等于它,这时再按照新找到的区间的右区间接着去找下一个区间,每找到一个新区间,自增计数器。

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

再强调一下,是按照右区间大小排的序,所以不用担心即使有左边界小右边界很大的区间,它也不会被先遍历到。

划分字母区间

763. 划分字母区间 - 力扣(LeetCode)
在这里插入图片描述

划分字母区间更像是回溯算法里的切割字符串的问题,实际上我认为这种方法应该貌似也是可行的。但是在这里我们要介绍的不是那种回溯递归的方法,而是用一个标记数组,标记每一个不同的字母最远出现在哪一个位置,做完了标记数组之后,我们再进行对字符串的分割。

要注意,分割后的每一块区域重新组合应该还是能得到原来字符串,所以不能选用会影响字符串顺序的算法。

我们定义两个变量left和right,left存的是当前要分割区间的最左端下标,right是最右端,用循环遍历该字母区间,如果碰到了当前字母在标记数组中的值比现在的right大,那么更新right值。直到变量i与right值相等,我们进行相减+1,压入返回数组中,加1是因为我们求得是划分的区间有个字母。

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

标记数组这个做题思路还是很巧妙的,让right存储最大值,相当于实时的更新分割线所处的地方,i和right相等时,说明了当前分割线以内都是可以被分割的,后面不会出现相同字母,因为标记数组标记了这些字母最远出现在哪里。在分割完毕的时候,我们再更新left的值。

合并区间

56. 合并区间 - 力扣(LeetCode)
在这里插入图片描述

合并区间我觉得和无重叠区间差不多,都是让数组内不出现重叠区间。只不过这个合并区间是真的要返回合并后的区间。思路其实我觉得能做出第一道题或许会有做出这道题的可能。

思路是先排序,但是和上一个不一样的是,这道题要从左区间从小到大排序好做一点,因为它的思路是直接合并重叠部分区间,而区别于第一道题的我们是找出非重叠的区间个数,那道题我们是避免找到重叠的,而这道题我们按照左区间从小到大的好处是,左区间小的会排在一起,这样我们比较时候发现第二个区间如果它的左区间小于前一个的右区间,则说明两区间一定有某一部分发生重叠,将其合并后,将合并区间看做整体扩大其右边界范围,直到找不出下一个的左区间小于上一个右区间为止,将改后区间加入数组,然后全部遍历后返回。

class Solution {
public:
static bool cmp(vector<int>&a,vector<int>&b)
{
    return a[0]<b[0];
}
    vector<vector<int>> merge(vector<vector<int>>& intervals) 
    {
        vector<vector<int>>result;
        if(intervals.size()==0)return result;
        sort(intervals.begin(),intervals.end(),cmp);
        result.push_back(intervals[0]);
        for(int i=1;i<intervals.size();i++)
        {
            if(result.back()[1]>=intervals[i][0])
            {
                result.back()[1]=max(result.back()[1],intervals[i][1]);
            }
            else result.push_back(intervals[i]);
        }
        return result;
    }
};

这是代码实现的缩减部分,主要就是比较区间然后不断改变右区间的值,实现了区间的合并,也并不是真正的删除重叠的区间,然后扩充。这里的else的目的是,如果当前判断到的区间不符合重叠了,那直接加入到数组里,然后用这个新加入的区间再重复之前的比较,往复便能实现所谓合并区间。

总结:

今天我们完成了无重叠区间、划分字母区间、合并区间三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

力扣在线OJ——栈和队列

目录 &#x1f341;一、用两个队列实现栈 &#x1f315;&#xff08;一&#xff09;、题目&#xff08;力扣链接&#xff1a;用队列实现栈 &#xff09; &#x1f315;&#xff08;二&#xff09;、注意 &#x1f315;&#xff08;三&#xff09;、解答 ⭐️1.注意事项 ⭐…

Java练习题2021-2

"某地大数据防疫平台记录了往来的所有防疫相关信息&#xff0c;包括 本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果、最近一次核酸检测时间等。 该地某区域对于进入人员的要求为&#xff1a; 如果是本地人员&#xff0c;需要绿码和疫苗完全接种方可进入&am…

单位建数字档案室的意义和作用

单位建立数字档案室的意义和作用包括&#xff1a; 1.提高档案管理效率。数字档案室可以高效地收集、整理和存储电子文档&#xff0c;通过数字化处理&#xff0c;文档的查找和检索速度大幅提升。 2.降低管理成本。数字档案室可以通过节约空间和人力成本&#xff0c;降低管理成本…

ubuntu扩大运行内存, 防止编译卡死

首先查看交换分区大小 grep SwapTotal /proc/meminfo 1、关闭交换空间 sudo swapoff -a 2、扩充交换空间大小&#xff0c;count64就是64G 1G x 64 sudo dd if/dev/zero of/swapfile bs1G count64 3、设置权限 sudo chmod 600 /swapfile 4、指定交换空间对应的设备文件 …

系列十四、Spring如何处理线程安全问题

一、线程安全问题出现的原因 Spring中出现线程安全的原因是&#xff0c;单实例bean中存在成员变量&#xff0c;并且有对这个bean进行读写的操作&#xff0c;因此出现了线程安全的问题。 二、案例代码 2.1、MySpringConfig /*** Author : 一叶浮萍归大海* Date: 2023/10/24 1…

假脱机技术(SPOOLing技术)

文章目录 1.什么是脱机技术1.脱机技术解决的问题 2.假脱机技术的实现原理1.输入井和输出井2.输入进程和输出进程3,输入缓冲区和输出缓冲区 3.共享打印机的原理分析1.把独占式的打印机改造成共享设备 1.什么是脱机技术 脱机&#xff1a;脱离主机的控制进行的输入输出操作。 批处…

【1++的Linux】之进程间通信(共享内存)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 我们在前面的文章中提到过&#xff0c;进程间的通信本质都是先看到同一块资源&#xff0c;然后通过这同一块资源进行通信&#xff0c;并且是单向的通信&#xff0c;只能一端发&#…

可视化 | (四)可视化降维

文章目录 &#x1f4da;降维的重要性&#x1f4da;MDS、PCA&#x1f407;MDS&#x1f407;PCA &#x1f4da;SNE&#x1f407;总述&#x1f407;SNE&#x1f407;Symmetric-SNE&#x1f407;T-SNE &#x1f4da;降维的重要性 降维在数据分析和可视化领域中扮演着重要的角色。当…

19、Python -- 关键字参数 与 参数默认值,参数收集 与 逆向参数收集

目录 关键字参数位置参数&#xff1a;关键字参数位置参数和关键字参数的混合使用关键字参数注意点 参数默认值使用参数默认值 普通参数收集&#xff08;*xxx&#xff09;注意点 关键字参数收集(**xxx)逆向参数收集注意点&#xff1a; dict&#xff08;字典&#xff09;的逆向参…

J2EE项目部署与发布(Windows版本)

目录 一.会议OA单体项目Windows部署 1.实操 二.spa前后端分离项目Windows部署 1.部署后端 2.部署前端 配置node.js 3.从实施的角度 4.从开发的角度 ​编辑 一.会议OA单体项目Windows部署 我们从实施的角度来看&#xff0c;拿到项目之后一定要问开发人员提供数据库脚…

SpringCloud复习:(8)Zuul内置过滤器

过滤器的执行顺序&#xff1a;根据filterOrder方法的返回值&#xff0c;返回值&#xff08;包含负数&#xff09;越小&#xff0c;越早执行 。 FilterProcessor类中会调用filter的runFilter方法 ZuulFilter中的runFilter方法会调用run方法&#xff1a;

在ffmpeg中,网络视频流h264为什么默认的转为YUV而不是其他格式

在做网络视频的时候&#xff0c;有些视频的编程概念&#xff0c;早点知道&#xff0c;早点弄清楚会少走很多的弯路。对应视频的转码&#xff0c;传输&#xff0c;一开始如果直接跟着代码跑的话&#xff0c;很容易觉得自己都明白了&#xff0c;但是为什么这样做&#xff0c;好像…

使用WebStorm创建和配置TypeScript项目

创建 这里我用的是WebStorm 2019.2.2版本 首先&#xff0c;创建一个空项目 File -> New -> Project->Empty Project生成配置文件 自动配置&#xff1a; 打开终端输入tsc --init&#xff0c;即可自动生成tsconfig.json文件 手动配置&#xff1a; 在项目根目录下新建一…

第四章 文件管理 八、文件保护

目录 一、口令保护 1、定义&#xff1a; 2、优点&#xff1a; 3、缺点: 二、加密保护 1、定义&#xff1a; 2、例子&#xff1a; 2、优点&#xff1a; 3、缺点: 三、访问控制 1、定义&#xff1a; 2、精简的访问控制表&#xff1a; &#xff08;1&#xff09;定义&a…

海南海口大型钢结构件3D扫描全尺寸三维测量平面度平行度检测-CASAIM中科广电

高精度三维扫描技术已经在大型工件制造领域发挥着重要作用&#xff0c;特别是在质量检测环节&#xff0c;高效、高精度&#xff0c;可以轻松实现全尺寸三维测量。本期&#xff0c;CASAIM要分享的应用是在大型钢结构件的关键部位尺寸及形位公差检测。 钢结构件&#xff0c;是将…

38 深度学习(二):tensorflow基础介绍

文章目录 tensorflow基础介绍基础张量自定义损失函数自定义模型和激活函数图函数&#xff08;略&#xff09;自动求导机制自定义fit tensorflow基础介绍 基础张量 import tensorflow as tf import numpy as np import pandas as pd# constant是常量张量 不能进行再次assign改…

【ETL工具】Datax-ETL-SqlServerToHDFS

&#x1f984; 个人主页——&#x1f390;个人主页 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; 感谢点赞和关注 &#xff0c;每天进步一点点&#xff01;加油&#xff01;&…

lazada获得lazada商品详情 API 返回值说明

item_get-获得lazada商品详情 lazada.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;获取key和secret接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_sear…

德思特新闻 | 走进德思特——通过创新帮助客户成功

文章来源&#xff1a;德思特测试测量 阅读原文&#xff1a;德思特新闻 | 走进德思特——通过创新帮助客户成功 走进德思特 2023年上半年&#xff0c;ChatGPT红遍全球&#xff0c;人工智能、B5G/6G、物联网、云计算、软件自动化等新兴技术的快速发展进一步推动科技行业的复苏…

vue核心面试题汇总【查缺补漏】

给大家推荐一个实用面试题库 1、前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;web前端面试题库 很喜欢‘万变不离其宗’这句话&#xff0c;希望在不断的思考和总结中找到Vue中的宗&#xff0c;来解答面试官抛出的…