【leetcode 力扣刷题】汇总区间//合并区间//插入区间

news2024/11/28 6:25:51

一些关于区间的力扣题目

  • 228. 汇总区间
  • 56. 合并区间
  • 57. 插入区间

228. 汇总区间

题目链接:228.汇总区间
题目内容:在这里插入图片描述
看题目真是没懂这个题到底是要干啥……实际上题目要求的恰好覆盖数组中所有数字最小有序区间范围列表,这个最小是指一个区间范围小。比如能够覆盖{2,3,4,6}的区间可以是[2,6],但是5在区间内,却不在数组内,因此这个区间不是最小的,可以缩小成[2,4]和[6,6],这才是满足题意恰好覆盖所有数字的最小区间。
理解题意后,解法就很简单了,为了保证区间能够覆盖所有数组中的数字,同时又不存在在区间内但不在数组内的数字,那就只能考虑用数组内的连续数字来组成区间。什么意思呢?就是把数组内连续的数字组成一个区间,单独的数字单独一个区间。比如上面的{2,3,4,6},其中{2,3,4}就是连续的,组成一个区间[2,4],6是单独的需要一个区间[6, 6]。由于数组本身是有序的,那么就找连续递增的数字组成一个区间,nums[j] == nums[j-1]。 代码如下(C++):

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        vector<string> ans;
        int start = 0, end = 1;
        while(end <= nums.size()){
            //end是连续区间结束后的数字
            if(end == nums.size() || nums[end] != nums[end - 1] + 1){
                if(start == end - 1)
                    //如果start和end-1相等,说明这是只有一个数字的独立区间
                    ans.emplace_back(to_string(nums[start]));
                else
                    //start到end-1是连续区间
                    ans.emplace_back(to_string(nums[start])+"->"+to_string(nums[end-1]));
                start = end;  //下一段区间的开始 
            }
            end++;         
        }
        return ans;
    }
};

56. 合并区间

题目链接:56. 合并区间
题目内容:
在这里插入图片描述
先看看给的例子,理解题意:
在这里插入图片描述
题目要求我们合并重叠的区间,那什么算是重叠的区间呢?在区间是按照左端点升序排序的前提下,前面一个区间d1的右端点与后面一个区间d2的左端点有交集,即d1.right ≥ d2.left,就说明两个区间重叠,至于d2.right与d1.right的大小关系,是不重要的:
在这里插入图片描述
d1和d2有交集,将两个区间合并成[ min(d1.left,d2.left),max(d1.right,d2.right) ]。
所以首先要做的是将区间数组按照区间的左端点排序,之后开始判断前后两个区间是否有重叠。判断是否重叠只需要将答案区间数组中最后一个区间和待加入的区间比较,因为当前答案数组的最后一个区间的left是比待加入的区间left更小的,答案区间数组中的区间是没有重叠的,那么答案数组中的最后一个区间的left肯定是大于再前面一个区间的right的,待加入区间的left肯定是比答案数组中倒数第二个区间的right更大的。代码如下(C++):

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size() == 0)
            return intervals;
        sort(intervals.begin(), intervals.end()); //排序,左端点升序
        vector<vector<int>> ans; //最终无重叠的区间数组
        for(int i = 0; i < intervals.size(); i++){
        	//对于第一个区间和不重叠的区间,直接加入
            if(ans.size() ==0 || ans.back()[1] < intervals[i][0])
                ans.emplace_back(intervals[i]);
            else
            	//有重叠的区间,最后一个区间的right要修改为两个重叠区间更大的right
                ans.back()[1] = max(intervals[i][1], ans.back()[1]);
        }
        return ans;
    }
};

57. 插入区间

题目链接:57. 插入区间
题目内容:
在这里插入图片描述
这道题其实和上一题是差不多的。给的区间已经按照左端点排序好了,先查找到待插入的区间应该插入的位置,然后插入再合并重叠的区间即可。如果一个区间d.right < newin.left的话,很显然这个区间d是和newin是不重叠的,在其左边;如果一个区间d.left > newin.right的话,很显然这个区间d在其右边,是不重叠的。除上述两种情况外,那就是有重叠的部分,和一个区间重叠后,合并的区间left = min(newin.left,d.left),只有第一个开始重叠的地方需要更新left,之后right = max(newin.right,d.right)。以下例举了部分情况:
在这里插入图片描述
实际上还有在最前面、最后面插入的情况,不需要额外讨论,一样按照上述三种情况去判断就好了,最前面和最后面只是插入的位置和重叠位置有些特殊。实现代码如下(C++):

class Solution {
public:
    vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
        vector<vector<int>> ans;
        int idx = 0;
        //先把在插入区间左边的区间直接加入答案数组中
        while(idx < intervals.size() && intervals[idx][1] < newInterval[0]){
            ans.emplace_back(intervals[idx]);
            idx++;
        }
        //如果已经在最后了或者是空的,直接插入
        if(idx == intervals.size()) {
            ans.emplace_back(newInterval);
            return  ans;
        }
        //否则idx对应的区间和待插入区间是有重叠的,更新left
        else{
            newInterval[0] = min(intervals[idx][0], newInterval[0]);
        }
        //开始查找重叠部分,直到找到在待插入区间右边的区间
        while(idx < intervals.size() && intervals[idx][0] <= newInterval[1]){   
            //有重叠就更新right         
            newInterval[1] = max(intervals[idx][1], newInterval[1]);   
            idx++;             
        }   
        //插入区间
        ans.emplace_back(newInterval);
        //之后的区间全在待插入区间的右边,直接加入
        while(idx < intervals.size())
            ans.emplace_back(intervals[idx++]);

        return ans;
    }
};

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

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

相关文章

QT 设置应用程序图标

1.下载xx.ico图标&#xff1a;ico网址 2.在线PNG转换ICO&#xff1a;png在线转换ico 3.添加图标资源 1&#xff09;新建文件路径 2&#xff09;添加图片资源 3&#xff09;在 .pro文件里面添加图片 4&#xff09;将xx.ico放到工程目录&#xff0c;编译完可以看到xx.exe的图标…

【LeetCode】515.在每个树行中找最大值

题目 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,10^4]-2^31 < No…

无涯教程-JavaScript - CUBERANKEDMEMBER函数

描述 CUBERANKEDMEMBER函数返回集合中的第n个或排序的成员。 使用此功能可返回一组中的一个或多个元素,如销售业绩最好的人或前十名的学生。 语法 CUBERANKEDMEMBER (connection, set_expression, rank, [caption])争论 Argument描述Required/OptionalconnectionThe name …

Linux--进程--创建子进程一般目的

父进程创建子进程的目的&#xff1a;简单来说&#xff1a;给特定的输入&#xff0c;给出特定的输出 父进程希望复制自己&#xff0c;使父、子进程同时执行不同的代码段。这在网络服务进程中是常见的——父进程等待客户端的服务请求。当请求到达&#xff0c;父进程调用fork&…

FPGA 学习笔记:Vivado 工程管理技巧

前言 当前使用 Xilinx 的 FPGA,所以需要熟悉 Xilinx FPGA 的 开发利器 Vivado 的工程管理方法 这里初步列举一些实际 Xilinx FPGA 开发基于 Vivado 的项目使用到的工程的管理技巧 代码管理 做过嵌入式软件或者其他软件开发的工程技术人员,都会想到使用代码管理工具,如 SVN 、…

架构师成长之路Redis第一篇|Redis 安装介绍以及内存分配器jemalloc

安装 Redis官网:https://redis.io/download/ 下载安装二进制文件 可下载安装最新版Redis7.2.0,或者可选版本6.x 我这里下载6.2.13和7.2最新版本,后面我们都是安装6.2.13版本的信息进行讲解 二进制文件安装步骤 安装前期准备: 安装gcc yum install gcc 压缩文件 tar -xzf re…

SpringCloud(34):Nacos服务发现

1 从单体架构到微服务 1.1单体架构 Web应用程序发展的早期,大部分web工程师将所有的功能模块打包到一起并放在一个web容器中运行,所有功能模块使用同一个数据库,同时,它还提供API或者UI访问的web模块等。 尽管也是模块化逻辑,但是最终它还是会打包并部署为单体式应用,这…

Linux:内核解压缩过程简析

文章目录 1. 前言2. 背景3. zImage 的构建过程4. 内核引导过程5. 内核解压缩过程6. 内核加压缩过程小结7. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff0c;作者不做任何承诺。 2. 背景 本文基于 ARM32架构 …

【德哥说库系列】-ASM管理Oracle 19C单实例部署

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

垃圾回收 - 引用计数法

GC原本是一种“释放怎么都无法被引用的对象的机制”。那么人们自然而然就会想到&#xff0c;可以让所有对象事先记录下“有多少程序引用了自己”。让各对象知道自己的“人气指数”&#xff0c;从而让没有人气的对象自己消失&#xff0c;这就是引用计数法。 1、计数器 计数器表…

【Unity基础】1.项目搭建与视图编辑

【Unity基础】1.项目搭建与视图编辑 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity基础系列博客&#xff0c;终于要开始写基础系列的博客了&#xff0c;前两篇的内容基本上与入门系列相同&#xff0c;如果有紧跟入门系列的同学可以直接从第三篇文章开始看 好了话不多说我们开…

Java切换到Kotlin,Crash率上升了?

前言 最近对一个Java写的老项目进行了部分重构&#xff0c;测试过程中波澜不惊&#xff0c;顺利上线后几天通过APM平台查看发现Crash率上升了&#xff0c;查看堆栈定位到NPE类型的Crash&#xff0c;大部分发生在Java调用Kotlin的函数里&#xff0c;本篇将会分析具体的场景以及…

ORB-SLAM3复现过程中遇到的问题及解决办法

在复现过程中遇到的问题的解决过程 1. 版本检查1.1 Opencv版本的检测1.2 Eigen版本的检测1.3 查看Python版本1.4 其他 2. 编译过程中遇到的问题及解决办法2.1 ./build.sh遇到的问题2.2 ./build_ros.sh遇到的问题 因为环境比较干净&#xff0c;所以遇到的问题相对少一些&#xf…

ARM 汇编基础知识

1.为什么学习汇编&#xff1f; 我们在进行嵌入式 Linux 开发的时候是绝对要掌握基本的 ARM 汇编&#xff0c;因为 Cortex-A 芯片一 上电 SP 指针还没初始化&#xff0c; C 环境还没准备好&#xff0c;所以肯定不能运行 C 代码&#xff0c;必须先用汇编语言设置好 C 环境…

【python】实现积分

借助sympy.integrate() 符号运算库&#xff0c;所以里面的exp()&#xff0c;sin()等都要使用sympy库中的函数&#xff0c;如果使用numpy库中的函数时没用的。 import sympy as sp import numpy as np x sp.symbols("x") print(sp.integrate(sp.exp(-x**2), (x, -s…

企业数据加密软件——「天锐绿盾」

「天锐绿盾」是一款企业数据加密软件&#xff0c;主要用于防止企业计算机信息被破坏、丢失和泄密。该软件采用文件过滤驱动实现透明加解密&#xff0c;对用户完全透明&#xff0c;不影响用户操作习惯。 PC访问地址&#xff1a; isite.baidu.com/site/wjz012xr/2eae091d-1b97-4…

makefile开发应用程序的一个通用模板

下面是一个通用的 Makefile 模板&#xff0c;用于开发 C 语言应用程序&#xff1a; # 编译器设置 CC gcc CFLAGS -Wall -Wextra -stdc99# 可执行文件名 TARGET your_program# 源文件和对象文件 SRCS main.c file1.c file2.c OBJS $(SRCS:.c.o)# 默认目标 all: $(TARGET)#…

buildroot修改内核防止清理重新加载办法

当你使用 Buildroot 构建 Linux 内核时&#xff0c;如果对内核文件进行了手动修改&#xff0c;重新执行 Buildroot 的构建过程将会覆盖你所做的修改。这是因为 Buildroot会根据配置重新下载、提取和编译内核。 为了避免在重新构建时覆盖你的修改&#xff0c;可以采取以下两种方…

减量时代下,伊利金领冠DTB新模式凭什么成为母婴行业“破局之道”?

穷则变&#xff0c;变则通&#xff0c;通则久。 当下&#xff0c;许多行业正在穿越不确定性周期&#xff0c;增长放缓成为常态。如何通过创新应对变局&#xff0c;进而实现长期主义&#xff0c;成为摆在所有行业和企业面前的课题。 众多行业中&#xff0c;婴配粉市场的不确定…

lv3 嵌入式开发-3 linux shell命令(文件搜索、文件处理、压缩)

目录 1 查看文件相关命令 1.1 常用命令 1.2 硬链接和软链接 2 文件搜索相关命令 2.1 查找文件命令 2.2 查找文件内容命令 2.3 其他相关命令 3 文件处理相关命令 3.1 cut 3.2 sed 过滤 3.3 awk 匹配 4 解压缩相关命令 4.1 解压缩文件的意义 4.2 解压缩相关命令 1 …