• 力扣练习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;
        }
    }

    力扣运行结果:

  • 相关阅读:
    单例模式
    堆排序--leetcode 215
    二叉树--路径问题
    二叉树--前中后序两两结合构建二叉树
    CglibProxy
    JdkProxy
    git config --global http.sslVerify false
    PdfUtil
    idea中创建的文件类型无法识别
    sql优化
  • 原文地址:https://www.cnblogs.com/sniffs/p/12554894.html
Copyright © 2020-2023  润新知