【LeetCode刷题笔记】56.合并区间

本文介绍了如何使用Java解决合并重叠区间的问题,通过排序区间左端点并使用Lambda表达式的比较器,实现区间合并。文章详细讲解了排序方法和toArray()方法的使用,并提供了示例代码。同时,探讨了Lambda表达式在比较器中的应用和原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 题目:以数组 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].

  • 排序
    这道题不多说,需要对各个区间的左端点进行排序,排序好之后的数组每个区间之间都是连续的,不会出现两个可以合并的区间之间出现另一个区间的情况,所以只需要进行一次遍历就能把区间合并。
    public int[][] merge(int[][] intervals){
//        按照左端点对数组进行排序,也可以在左端点相等的时候再对右端点进行排序,但由于后面取的是右端点的最大值,所以没什么必要
//        Arrays.sort(intervals, (a1, a2) -> a1[0] == a2[0] ? a1[1] - a2[1] : a1[0] - a2[0]);
        Arrays.sort(intervals, (a1, a2) -> a1[0] - a2[0]);
        List<int[]> result = new ArrayList<>();
        for (int i = 0; i < intervals.length; i++){
//            如果i的右端点比i+1的左端点大或相等,那这两个就可以合并了
            if (i < intervals.length - 1 && intervals[i][1] >= intervals[i + 1][0])
//                合并之后的左区间肯定是等于i的左区间,但右区间要看i和i+1的右区间哪个更大
                intervals[i + 1] = new int[]{intervals[i][0], Math.max(intervals[i][1], intervals[i + 1][1])};
            else
                result.add(intervals[i]);
        }

        return result.toArray(new int[result.size()][]);
    }
  • 这道题对我来说不熟练的部分在于sort方法的比较器的Lambda表达式写法以及其中原理;还有toArray方法的使用,下面列出了这两个问题的相关解答供和我有一样疑问的朋友参考。


【Java】从Arrays.sort方法的源码探究到Comparator比较器的各种写法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值