LeetCode算法学习之合并区间

代码完整展示如下:

java 复制代码
class Solution {
    public int[][] merge(int[][] intervals) {
        if (intervals.length <= 1) {
            return intervals;
        }

        // 按区间起始位置排序
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
        
        List<int[]> result = new ArrayList<>();
        int[] currentInterval = intervals[0];
        result.add(currentInterval);
        
        for (int[] interval : intervals) {
            int currentEnd = currentInterval[1];
            int nextStart = interval[0];
            int nextEnd = interval[1];
            
            if (currentEnd >= nextStart) {
                // 有重叠,合并区间
                currentInterval[1] = Math.max(currentEnd, nextEnd);
            } else {
                // 无重叠,添加新区间
                currentInterval = interval;
                result.add(currentInterval);
            }
        }
        
        return result.toArray(new int[result.size()][]);
    }
}

首先对输入数组进行一个长度判定,若数组只有一个元素或者一个元素都没有,则直接返回输入数组即可,然后需要对二维数组中的一维数组进行排序,因为题目给定的二维数组内部没有说明是有序的,为了后边的操作正常,需要提前对数组进行排序,这里排序使用的是Arrays工具类中的sort方法,并且添加了一个自定义比较规则,(a, b) -> Integer.compare(a[0], b[0]),a,b代表的是二维数组中的两个一维数组,我们需要根据一维数组的首元素进行比较,所以后边是a[0], b[0],进行比较,然后创建一个list集合来存储结果集,根据list特性可以获取长度,为后边返回二维数组的长度提供依据,将原数组的首元素先存入list集合中,后续如果有重叠部分就修改这个元素的值,在for循环中处理真正的合并逻辑,先定义三个变量,currentEnd:表示当前处理区间的尾元素,nextStart:表示下一个区间的首元素,nextEnd:表示下一个区间的尾元素,如果currentEnd >= nextStart说明有重叠,此时要修改当前区间的尾元素为Math.max(currentEnd, nextEnd),即currentEnd, nextEnd两者中的最大值,如果没有重叠,就把当前遍历到的区间更新为currentInterval正在处理区间,并添加到结果集中,最后返回result.toArray(new int[result.size()][]);

相关推荐
weixin_395772473 分钟前
计算机网络学习笔记】初始网络之网络发展和OSI七层模型
笔记·学习·计算机网络
南境十里·墨染春水19 分钟前
linux学习进展 进程的内存管理
linux·服务器·学习
小陈phd25 分钟前
多模态大模型学习笔记(三十四)——ChatTTS:新一代中文语音合成工具原理与实战解析
笔记·学习·语音识别
郝学胜-神的一滴28 分钟前
[简化版 GAMES 101] 计算机图形学 04:二维变换上
c++·算法·unity·godot·图形渲染·unreal engine·cesium
ZC跨境爬虫28 分钟前
海南大学交友平台开发实战day7(实现核心匹配算法+解决JSON请求报错问题)
前端·python·算法·html·json
计算机安禾33 分钟前
【数据结构与算法】第41篇:图论(五):拓扑排序与关键路径
c语言·数据结构·c++·算法·图论·visual studio
Q741_14736 分钟前
每日一题 力扣 1320. 二指输入的的最小距离 动态规划 C++ 题解
c++·算法·leetcode·动态规划
zhangrelay43 分钟前
面向机器人工程的 Linux 发行版:科学选型与深度评测-2026
笔记·学习
wfbcg44 分钟前
每日算法练习:LeetCode 76. 最小覆盖子串 ✅
算法·leetcode·职场和发展
Wect1 小时前
LeetCode 149. 直线上最多的点数:题解深度剖析
前端·算法·typescript