力扣练习009---合并区间(56)

题目描述:

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

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

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

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。

题目分析:

1、不难想到,要比较不同区间的终止值和起始值,终止值大于起始值:区间合并;还要判断被合并的区间的终止值是否大于原区间的终止值;

2、但是要注意:输入并不像题目实例给的那样按照起始值排序;我第一次就想当然了。

3、因此,思路为先将输入按照起始值排序,然后按照1执行区间合并

Java代码:

public int[][] merge(int[][] intervals) {
    // 按照起始排序, 后续合并区间时, 按照是顺序合并即可
    List<Interval> intervalList = Arrays.stream(intervals)
            .map(val -> new Interval(val[0], val[1]))
            .sorted(Comparator.comparingInt(val -> val.start))
            .collect(Collectors.toList());

    // 合并区间
    LinkedList<Interval> linkedList = new LinkedList<>();
    for (Interval interval : intervalList) {
        if (linkedList.isEmpty() || interval.start > linkedList.getLast().end) {
            linkedList.add(interval);
        } else {
            linkedList.getLast().end = Math.max(linkedList.getLast().end, interval.end);
        }
    }

    // 转换成二维数组输出
    return linkedList.stream()
            .map(val -> new int[] {val.start, val.end})
            .toArray(int[][]::new);
}

static class Interval {
    int start;
    int end;

    Interval(int start, int end) {
        this.start = start;
        this.end = end;
    }
}

力扣运行结果:

原文地址:https://www.cnblogs.com/sniffs/p/12554894.html