【LeetCode】合并区间Java题解

67 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第33天,点击查看活动详情

题目描述

以数组 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] 可被视为重叠区间。
 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/merge-intervals
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法题目是合并区间问题,题目求解的是返回一个不重叠的区间数组。题意比较容易理解,我们首先需要将输入的数组按照 intervals[i][0] 排序,使得左边界按照升序排序。当intervals[i][0]相同时候,按照 intervals[i][1] 升序排序,方便我们比较。接着,初始化 start, end。然后动态比较每一个排序intervals[i]。
  • 具体实现代码如下,供参考。

通过代码

class Solution {
    public int[][] merge(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[0] != o2[0]) {
                    return o1[0] - o2[0];
                } else {
                    return o1[1] - o2[1];
                }
            }
        });

        List<int[]> tempAns = new LinkedList<>();
        int start = -1;
        int end = -1;
        for (int[] interval : intervals) {
            int left = interval[0];
            int right = interval[1];
            if (left <= end) {
                end = Math.max(end,right);
            } else {
                if (end != -1) {
                    tempAns.add(new int[]{start, end});
                }
                start = left;
                end = right;
            }
        }
        tempAns.add(new int[]{start, end});
        int n = tempAns.size();

        int[][] ans = new int[n][];
        int i = 0;
        while (i < n) {
            ans[i] = tempAns.get(i);
            i++;
        }
        return ans;
    }
}

总结

  • 上述算法的时间复杂度是O(n log n), 空间复杂度是O(n)
  • 坚持算法每日一题,加油!