力扣 56.合并区间

题目描述

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

示例 1:

复制代码
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

复制代码
输入:intervals = [[1,4],[4,5]]
输出:[[1,5]]
解释:区间 [1,4] 和 [4,5] 可被视为重叠区间。

题解

这道题实现思路很简单,但是需要之前有做过合并区间类似的题,这样才能快速找到正确思路。

看到有关区间的问题,就要想到先按照开始时间(也就是区间起始位置,这里统一叫做开始时间)进行排序,排完序之后,相邻区间的关系就只有三种了,如实现代码中1 2 3所示 。这道题中,要求合并能合并的区间,并且讲合并之后的结果返回,那么考虑1 2 3哪种情况不能合并,显然是3,即遍历到的区间的开始时间大于结果数组中最后一个区间的结束时间,结果数组中存储的区间已经是把当前便利的区间之前能合并的区间都合并了之后的结果,并且由于初始化的时候就将所有待合并区间按照开始时间从小到大排过序了,所以结果数组中保存的合并之后的区间也是从小到大排序的,自然结果数组中最后一个区间才是唯一有可能和当前数组进行合并的数组。自此,当前数组要想合并的条件就已找出。idx控制添加到结果数组中的区间下标,由于最终结果数组的大小肯定不会超过原始区间数组大小,因此返回的时候,要从结果数组的0号位置拷贝到idx位置 才是真正存储了合并区间结果的范围。

代码实现

java 复制代码
public static int[][] merge(int[][] intervals) {
        //首先按照开始时间进行排序
        Arrays.sort(intervals,(v1,v2)->v1[0]-v2[0]);
        //那么现在相邻的两个区间的区间布局就只有三种情况:
        //1、---------     2、-------  3、------
        //       ------        ----             -----
        //如果是第三种情况则不需要进行相邻区间合并,前两种情况合并的时候需要看
        //end值哪一个区间更大作为新区间的end
        int[][] res = new int[intervals.length][2];//存储结果值
        int idx = -1;//结果数组的下标值
        for (int[] interval:intervals){//这样取出来的是元素个数为2的一维数组
            //第3种情况,当前数组的开始时间大于结果数组的结束时间,那么就说明当前数组不能被合并,直接插入结果数组
            if(idx==-1||interval[0]>res[idx][1]){//idx判断是否是首个数组,是的话一定会加入结果数组,因为只有结果数组中有一个值,
                //才能来判断后续的数组能否和该结果数组中存储的这个区间合并
                res[++idx]=interval;
            }else{//1.2种情况进行合并
                res[idx][1] = Math.max(res[idx][1],interval[1]);
            }
        }
        return Arrays.copyOf(res, idx + 1);
    }

知识点

二维数组从小到大排序:

java 复制代码
 Arrays.sort(intervals,(v1,v2)->v1[0]-v2[0])

上面使用了lambda表达式来排序,等价于

java 复制代码
Arrays.sort(intervals, (v1, v2) -> Integer.compare(v1[0], v2[0]));

但是注意:第一种方式直接通过相减来进行比较。如果 v1[0]v2[0] 的差值太大,可能会导致整数溢出。例如,如果 v1[0] 是非常大的正数而 v2[0] 是非常大的负数,差值可能会溢出并导致错误的排序结果。

相关推荐
进击的小头12 分钟前
实战案例:51单片机低功耗场景下的简易滤波实现
c语言·单片机·算法·51单片机
咖丨喱2 小时前
IP校验和算法解析与实现
网络·tcp/ip·算法
罗湖老棍子2 小时前
括号配对(信息学奥赛一本通- P1572)
算法·动态规划·区间dp·字符串匹配·区间动态规划
fengfuyao9852 小时前
基于MATLAB的表面织构油润滑轴承故障频率提取(改进VMD算法)
人工智能·算法·matlab
机器学习之心2 小时前
基于随机森林模型的轴承剩余寿命预测MATLAB实现!
算法·随机森林·matlab
一只小小的芙厨2 小时前
寒假集训笔记·树上背包
c++·笔记·算法·动态规划
庄周迷蝴蝶3 小时前
四、CUDA排序算法实现
算法·排序算法
以卿a3 小时前
C++(继承)
开发语言·c++·算法
I_LPL3 小时前
day22 代码随想录算法训练营 回溯专题1
算法·回溯算法·求职面试·组合问题
金融RPA机器人丨实在智能3 小时前
2026动态规划新风向:实在智能Agent如何以自适应逻辑重构企业效率?
算法·ai·重构·动态规划