LeetCode 56. Merge Intervals

LeetCode 56. Merge Intervals (合并区间)

题目

链接

https://leetcode.cn/problems/merge-intervals/

问题描述

以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。

示例

输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

提示

1 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti <= endi <= 104

思路

贪心思想,首先根据左边界排序,之后依次判断并更新右边界,确保右边界是这区间中最远的,直到一个不在这左右边界中的,那就应该更新了。

复杂度分析

时间复杂度 O(n)
空间复杂度 O(n)

代码

Java

    public int[][] merge(int[][] intervals) {
        List<int[]> ans = new LinkedList<>();
        Arrays.sort(intervals, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });
        int start = intervals[0][0];

        for (int i = 1; i < intervals.length; i++) {
            if (intervals[i][0] > intervals[i - 1][1]) {
                ans.add(new int[]{start, intervals[i - 1][1]});
                start = intervals[i][0];
            } else {
                intervals[i][1] = Math.max(intervals[i][1], intervals[i - 1][1]);
            }
        }
        ans.add(new int[]{start, intervals[intervals.length - 1][1]});
        return ans.toArray(new int[ans.size()][]);
    }
posted @ 2022-06-28 20:10  cheng102e  阅读(19)  评论(0编辑  收藏  举报