56.合并区间

题目描述


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

题目分析


  1. 对sort自定义排序,一维升序,二维降序。利用lambda表达式,注意记一下。
  2. 不能用二维数组作为结果集,因为数组的长度需要提前设定,但是无法得知。所以若有多余的会用[0] [0]补全;
    在这里插入图片描述
  3. 在这里插入图片描述
class Solution {
    public int[][] merge(int[][] intervals) {
        if(intervals.length < 2) return intervals;
        Arrays.sort(intervals, (o1, o2) -> {
            if(o1[0] == o2[0]){
                return o2[1] - o1[1];
            }
            else{
                return o1[0] - o2[0];
            }
        });

        
        //int[][] res = new int[intervals.length][2];//用来存储结果的二位数组,yo
        List<int[]> res = new ArrayList<>();
        int max = intervals[0][1];
        //int idx  = 0;
        res.add(intervals[0]);//先把第一个区间加进去

        //再进行遍历且对第二维进行比较,如果当前的值大于max,
        //1.当前一维数组的头(第一维)与尾(max)比较,如果头<尾,则说明区间重叠,则更新max,并更新而伟结果数组中的区间
        //2. 若头>尾,则不重叠,直接将当前区间加入结果集中
        for(int[] interval : intervals){
            if(interval[1] > max){
                if(interval[0] <= max){
                    max = interval[1];
                    res.get(res.size()-1)[1] = max;
                }
                else{
                    max = interval[1];
                    res.add(interval);
                } 
            }
        }

        //遍历列表
        int idx  = 0;
        int[][] resArray = new int[res.size()][2];
        for(int[] row : res){
            resArray[idx++] = row;
        }

        return resArray;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值