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

2023-09-17 19:43:17

今天的三道题目,都算是 重叠区间 问题,大家可以好好感受一下。 都属于那种看起来好复杂,但一看贪心解法,惊呼:这么巧妙! 

还是属于那种,做过了也就会了,没做过就很难想出来。

不过大家把如下三题做了之后, 重叠区间 基本上差不多了

 435. 无重叠区间 

与引爆气球相似,差不多;

代码随想录

public int eraseOverlapIntervals(int[][] intervals) {
        Arrays.sort(intervals, (a,b)-> {
            return Integer.compare(a[0],b[0]);
        });
        int remove = 0;
        int pre = intervals[0][1];
        for(int i = 1; i < intervals.length; i++) {
            if(pre > intervals[i][0]) {
                remove++;
                pre = Math.min(pre, intervals[i][1]);//重点
            }
            else pre = intervals[i][1];
        }
        return remove;
    }
时间复杂度:O(nlog n) ,有一个快排
空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间

 763.划分字母区间 

代码随想录

时间复杂度:O(n)
空间复杂度:O(1),使用的hash数组是固定大小

public List<Integer> partitionLabels(String S) {
        List<Integer> list = new LinkedList<>();
        int[] edge = new int[26];
        char[] chars = S.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            edge[chars[i] - 'a'] = i;
        }
        int idx = 0;
        int last = -1;
        for (int i = 0; i < chars.length; i++) {
            idx = Math.max(idx,edge[chars[i] - 'a']);
            if (i == idx) {
                list.add(i - last);
                last = i;
            }
        }
        return list;
    }

 56. 合并区间  

本题相对来说就比较难了。

代码随想录

本题的本质其实还是判断重叠区间问题。

大家如果认真做题的话,话发现和我们刚刚讲过的452. 用最少数量的箭引爆气球 (opens new window)和 435. 无重叠区间 (opens new window)都是一个套路。

这几道题都是判断区间重叠,区别就是判断区间重叠后的逻辑,本题是判断区间重贴后要进行区间合并。

所以一样的套路,先排序,让所有的相邻区间尽可能的重叠在一起,按左边界,或者右边界排序都可以,处理逻辑稍有不同。

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

public int[][] merge(int[][] intervals) {
        LinkedList<int[]> res = new LinkedList<>();
        Arrays.sort(intervals, (o1, o2) -> Integer.compare(o1[0], o2[0]));
        res.add(intervals[0]);
        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] <= res.getLast()[1]) {
                int start = res.getLast()[0];
                int end = Math.max(intervals[i][1], res.getLast()[1]);
                res.removeLast();
                res.add(new int[]{start, end});
            }
            else {
                res.add(intervals[i]);
            }         
        }
        return res.toArray(new int[res.size()][]);
    }

更多推荐

【Java实战项目】【超详细过程】—— 大饼的图片服务器

目录一.下载前端模板二.展示图片(index.htmll)1.标题2.页面跳转链接3.图片展示引入js和vue依赖:写在html文件的head中js代码:写在html文件中的body中html代码:写在html文件的body中二.删除图片在上面的vue对象app中直接加入一个删除方法将OPEN按钮改成删除按钮四.上传图

Java中的一些不常见的关键字

transient对于transient修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略。因此,transient变量不会贯穿对象的序列化和反序列化,生命周期仅存于调用者的内存中而不会写到磁盘里进行持久化。Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的数据和信息,一个序

Git版本控制:入门到精通

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

龙蜥白皮书精选:机密计算平台技术

文/云原生机密计算SIG机密计算是一种依赖于硬件的使用中数据保护技术。芯片厂商通过提供特殊的硬件指令、受保护的加密内存区域等手段,辅以基于硬件的密钥管理和密码学操作,为使用中的数据提供了一个受保护的可信编程环境,通常称之为可信执行环境(TrustedExecutionEnvironment,简称TEE)。利用最底层硬件

【C语言】basename函数

basename()是一个Linux系统编程常用的C语言库函数,包含在头文件<libgen.h>中。basename()函数的作用是从一个路径中提取文件名部分。主要的原型如下:char*basename(char*path);给定一个文件路径,basename会返回指向路径中最后一个'/'后的文件名部分字符串的指针。例

【软考中级】网络工程师:知识产权和标准化

我国标准的级别《中华人民共和国标准化法》将标准划分为4个层次:国家标准行业标准地方标准企业标准除此之外还有国际标准,如:ISO(国际标准化组织)、IEC(国际电工委员会)、ITU(国际电信联盟)。国家标准和行业标准国家标准GB:强制性国家标准GB/T:推荐性国家标准GB/Z:指导性国家标准GSB:国家实物标准行业标准对

误删桌面文件如何恢复?试试这个方法!

“桌面文件误删除怎么找回?今天我同事的电脑突然出现内存不够的提示,之后自动重启,等待启动完毕后发现桌面文件全部消失了,这是怎么回事?如何解决这个问题呢?我原本打算检查系统隐藏文件SystemvolumeInformation是否还在,但却告诉我没有权限查看,然后我按照网络上的教程利用注册表注册再以管理员身份查看,却又告

Java浅谈随笔,你都会了吗?

(一)当面试官问到你对反射的认识和使用时,你可以回答以下内容:反射的认识:反射是Java语言中一种强大的机制,它允许程序在运行时动态地获取和操作类的信息、对象的字段和方法。通过反射,我们可以在运行时检查和修改类的结构,调用对象的方法,甚至可以创建新的对象。反射提供了一种灵活的方式来实现动态的功能和增强代码的复用性。反射

DA5 网站用户没有补全的信息

目录1.题目描述2.输入描述3.输出描述4.题目分析5.通过代码1.题目描述现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔):Nowcoder_ID:用户IDLevel:等级Achievement_value:成就值Num_of_exercise:刷题量Gra

Navicat安装使用教程

众所周知,Navicat是一款轻量级的用于MySQL连接和管理的工具,非常好用,使用起来方便快捷,简洁。下面我会简单的讲一下其安装以及使用的方法。并且会附带相关的永久安装教程。简介一般我们在开发过程中是离不开数据库的,Navicat是一款轻量级的用于MySQL连接和管理的工具,非常好用。https://note.you

redis -- 基本介绍 -- 字符串、列表、集合、有序集合、哈希

目录Redis字符串string列表list集合set有序集合sortedset哈希hashRedisRedis(RemoteDictionaryServer)是一个开源的、高性能的、内存中的数据存储系统他可以用作数据库缓存和消息队列等各种场景是目前最热门的NoSQL数据库之一MySQL的磁盘IO读写速度与内存相比非常

热文推荐