LeetCode刷题 | 合并区间问题

在编程问题中,我们常常会遇到需要处理区间数据的情况,比如安排会议时间、处理时间段的统计等。合并区间问题就是这类问题中的一个典型,它要求我们将若干个区间集合进行合并,使得最终结果中的区间相互不重叠,并且能够完全覆盖原始输入中的所有区间。本文将详细介绍这个问题的解题思路,并给出对应的 Java 代码实现。

问题描述

给定一个二维数组 intervals,其中每个子数组 intervals[i] = [starti, endi] 表示一个区间的起始和结束位置。我们的任务是合并所有重叠的区间,并返回一个不重叠的区间数组,该数组要恰好覆盖输入中的所有区间。

例如,输入 intervals = [[1,3],[2,6],[8,10],[15,18]],由于区间 [1,3][2,6] 重叠,将它们合并为 [1,6],最终输出为 [[1,6],[8,10],[15,18]]

解题思路

排序处理

为了方便处理区间的合并,我们首先需要对所有区间按照起始位置进行排序。这样做的好处是,相邻的区间在顺序上是连续的,我们可以依次比较相邻区间是否重叠,从而进行合并操作。

在 Java 中,我们可以使用 Arrays.sort 方法并自定义 Comparator 来实现对二维数组按照每个子数组的第一个元素进行排序,代码如下:

java

css 复制代码
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));

合并重叠区间

排序完成后,我们可以开始遍历排序后的区间列表。初始化一个结果列表,并将排序后的第一个区间添加到结果列表中。然后,从第二个区间开始,逐个检查当前区间是否与结果列表中的最后一个区间重叠。

合并条件

如果当前区间的起始位置小于等于结果列表中最后一个区间的结束位置,说明这两个区间有重叠,需要将它们合并。合并后的区间的结束位置是两个区间结束位置的较大值。否则,将当前区间直接添加到结果列表中。

Java 代码实现

ini 复制代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Solution {
    public int[][] merge(int[][] intervals) {
        // 处理输入为空的情况
        if (intervals.length == 0) {
            return new int[0][2];
        }

        // 按照区间的起始位置进行排序
        Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));

        // 用于存储合并后的区间
        List<int[]> merged = new ArrayList<>();
        // 将第一个区间添加到结果列表中
        merged.add(intervals[0]);

        // 遍历排序后的区间数组
        for (int i = 1; i < intervals.length; i++) {
            // 获取结果列表中的最后一个区间
            int[] last = merged.get(merged.size() - 1);
            // 获取当前遍历到的区间
            int[] current = intervals[i];

            // 如果当前区间的起始位置小于等于上一个区间的结束位置,则合并
            if (current[0] <= last[1]) {
                last[1] = Math.max(last[1], current[1]);
            } else {
                // 否则,将当前区间添加到结果列表中
                merged.add(current);
            }
        }

        // 将结果列表转换为二维数组并返回
        return merged.toArray(new int[merged.size()][]);
    }
}

总结

合并区间问题通过排序和遍历的方法可以高效地解决。排序使得区间的处理更加有序,便于我们判断相邻区间是否重叠并进行合并。这种方法在处理区间数据时具有很好的通用性和实用性,在实际编程中可以灵活应用。

相关推荐
江畔柳前堤8 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore10 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考11 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX12 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面12 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号13 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽13 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI13 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者15 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者15 小时前
【征程6】校准量化中HistogramObserver解析
算法