力扣56. 合并区间

题目链接

力扣56. 合并区间

思路

合并

先对每个区间进行排序,左端点值小的放在前面。然后对这些区间进行合并,对于一个的结果集合,如果本区间与前一个区间不重叠,则创建一个新区间加入到这个集合中;否则取这两个区间右端点的最大值作为前一个区间的右端点,这就是合并两个区间为一个区间的操作。

排序

对于 J a v a Java Java 来说,可以使用 M a t h . s o r t ( ) Math.sort() Math.sort() 方法进行排序,即有 Arrays.sort(intervals, (interval1, interval2) -> interval1[0] - interval2[0]);,此处使用了 l a m b d a lambda lambda 表达式简化内部类的编写。
但是这样的性能不是很高,执行时间大约为 7 m s 7ms 7ms,可以自己实现一个排序的方法,本题采用定制快速排序的方法进行排序,如果对快速排序不了解,可以先看看这篇文章快速排序

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        // 1. 如果intervals为空,则返回空数组
        if (intervals.length == 0) {
            return new int[0][2];
        }

        // 2. 按区间左端点的大小进行排序
        quickSort(intervals, 0, intervals.length - 1);

        // 3. 对区间进行合并
        List<int[]> res = new ArrayList<>();
        for (int i = 0; i < intervals.length; i++) {
            int left = intervals[i][0];             // 本轮循环的区间左端点
            int right = intervals[i][1];            // 本轮循环的区间右端点

            if (res.size() == 0) {                  // 若res为空 
                res.add(new int[]{left, right});    // 增加一个新的区间
                continue;                           // 不必进行区间的比较
            }

            int[] tmp = res.get(res.size() - 1);
            if (tmp[1] < left) {                    // 若两个区间不重叠
                res.add(new int[]{left, right});    // 增加一个新的区间
            } else {                                // 否则
                tmp[1] = Math.max(tmp[1], right);   // 让区间的右端点取 原右端点 和 现右端点 的最大值
            }
        }

        // 4. 返回一个二维数组
        return res.toArray(new int[res.size()][]);
    }

    private void quickSort(int[][] intervals, int left, int right) {
        if (left > right) {
            return;
        }

        int tmp = intervals[left][0]; // 默认以数组的左端点作为基准进行排序
        int[] t;
        int i = left;
        int j = right;

        // 分区
        while (i < j) {
            // 获取大于tmp的元素的索引
            while (tmp <= intervals[j][0] && i < j) {
                j--;
            }

            // 获取小于tmp的元素的索引
            while (tmp >= intervals[i][0] && i < j) {
                i++;
            }

            // 将小于tmp的元素放在左边,将大于tmp的元素放在右边
            t = intervals[j];
            intervals[j] = intervals[i];
            intervals[i] = t;
        }

        // i指向小于tmp的最后一个元素,将基准放到小于tmp和大于tmp的中间
        int[] arr = intervals[left];
        intervals[left] = intervals[i];
        intervals[i] = arr;

        // 对tmp左边进行分区
        quickSort(intervals, left, j - 1);
        // 对tmp右边进行分区
        quickSort(intervals, j + 1, right);
    }
}

相关推荐

  1. 56. 合并区间

    2024-04-29 18:58:02       46 阅读
  2. 56.合并区间

    2024-04-29 18:58:02       58 阅读
  3. 56. 合并区间

    2024-04-29 18:58:02       34 阅读
  4. 56.合并区间

    2024-04-29 18:58:02       43 阅读
  5. 100】56.合并区间

    2024-04-29 18:58:02       70 阅读
  6. 56. 合并区间(贪心)

    2024-04-29 18:58:02       55 阅读
  7. 【算法详解】56.合并区间

    2024-04-29 18:58:02       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-29 18:58:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-29 18:58:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-29 18:58:02       82 阅读
  4. Python语言-面向对象

    2024-04-29 18:58:02       91 阅读

热门阅读

  1. 基于单片机的家居智能系统设计与实现

    2024-04-29 18:58:02       31 阅读
  2. leetcode 144. 二叉树的前序遍历

    2024-04-29 18:58:02       36 阅读
  3. 【python】去除水印的几种方式

    2024-04-29 18:58:02       28 阅读
  4. 苏震巍与 Scott Hanselman 有关 AI 及智能体的访谈

    2024-04-29 18:58:02       25 阅读
  5. AntDesignReact提示key重复解决方案

    2024-04-29 18:58:02       26 阅读
  6. 什么是 CSRF 攻击,如何避免?

    2024-04-29 18:58:02       30 阅读
  7. spring restTemplate的使用和学习总结

    2024-04-29 18:58:02       33 阅读
  8. Spring AOP相关注解与execution 切点表达式概述

    2024-04-29 18:58:02       29 阅读
  9. 什么是面向对象?

    2024-04-29 18:58:02       23 阅读