博客
关于我
leetcode题解56-合并区间
阅读量:790 次
发布时间:2023-01-31

本文共 1792 字,大约阅读时间需要 5 分钟。

要解决这一问题,我们需要合并所有重叠的区间,返回一个不重叠的区间数组。以下是详细的实现思路:

实现步骤

  • 输入验证:首先检查输入的区间数是否为0或1。如果是,直接返回输入数组。
  • 排序区间数组:将区间数组按左端点进行升序排序。这样有助于后续处理相邻的区间,判断是否有重叠。
  • 初始化结果集合:使用动态数组(ArrayList)来存储合并后的结果。
  • 遍历区间数组
    • 初始化当前区间为第一个区间。
    • 对每个后续的区间,检查它是否与当前区间重叠。
    • 如果重叠,则更新当前区间的右端点为两个区间右端点的最大值。
    • 如果不重叠,则将当前区间添加到结果中,并将当前区间设为下一个区间。
  • 添加最后一个区间:循环结束后,确保将最后一个区间添加到结果中。
  • 转换为二维数组结果:将动态数组中的结果转换为二维数组返回。
  • 具体实现代码

    import java.util.ArrayList;import java.util.Arrays;import java.util.Comparator;import java.util.List;public class Solution {    public int[][] merge(int[][] intervals) {        if (intervals.length == 0 || intervals.length == 1) {            return intervals;        }        // 对区间的左端点进行排序        Arrays.sort(intervals, new Comparator
    () { public int compare(int[] o1, int[] o2) { return o1[0] - o2[0]; } }); // 使用动态数组保存结果 List
    lists = new ArrayList<>(); int start = intervals[0][0]; int end = intervals[0][1]; for (int i = 1; i < intervals.length; i++) { int[] current = intervals[i]; if (current[0] > end) { // 没有重叠,将当前区间加入结果 lists.add(new int[]{start, end}); start = current[0]; end = current[1]; } else { // 有重叠,更新当前区间的右端点 end = Math.max(end, current[1]); } } // 将最后一个区间加入结果 lists.add(new int[]{start, end}); int[][] res = new int[lists.size()][]; for (int i = 0; i < lists.size(); i++) { res[i] = lists.get(i); } return res; }}

    代码解释

    • 排序与比较:使用自定义的比较器对区间数组排序,确保区间按照左端点升序排列。
    • 动态数组处理结果:使用ArrayList来存储结果,这样可以灵活地动态增加或修改元素。
    • 合并逻辑:遍历每个区间,检查当前区间是否与下一个区间重叠,重叠则合并,否则添加当前区间到结果。
    • 最后处理:循环结束后,添加最后一个当前区间到结果中,以确保不遗漏。

    这个方法高效且清晰,能够正确地合并所有重叠的区间,并返回一个不重叠的区间数组。

    转载地址:http://aegyk.baihongyu.com/

    你可能感兴趣的文章
    Lepus搭建企业级数据库全方位监控系统
    查看>>
    LESS 中的变量有什么作用?如何声明和使用变量?
    查看>>
    Less 日常用法
    查看>>
    Lettuce 移动框架 for Romantic
    查看>>
    let、const、var的四点区别( 代码示例 )
    查看>>
    LexPredict法律词典项目教程
    查看>>
    LF.73.Combinations Of Coins
    查看>>
    LFS最终幻想
    查看>>
    lftp命令详解
    查看>>
    LFU算法实现
    查看>>
    lib/libstdc++.so.6: version `GLIBCXX_3.4.30‘ not found (required by /lib/x86_64-linux-gnu/libLLVM-15
    查看>>
    LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
    查看>>
    libcurl 发送邮件_C++ 邮件推送 (smtp+libcurl+openssl)
    查看>>
    Libevent 事件管理和添加事件
    查看>>
    libevent-简单的定时器
    查看>>
    libevent在windows下使用步骤详解
    查看>>
    Libevent源码分析(一):最小堆
    查看>>
    libgdx的菜单配置,以及json文件的结构
    查看>>
    libiconv字符集转换库在C#中的使用
    查看>>
    liblognorm编译
    查看>>