leetcode 56. 合并区间

难度:中等
频次:83

题目

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

解题思路: 用排序辅助判断前后元素是否有交集即可

注意:
  • 排序用了Arrays类自带的静态函数sort,并且借助了lambda表达式(v1,v2)-> v1[0]-v2[0])
  • 用k计数新的res里一共有多少个元素
  • 迭代用 for(int[] interval:intervals)
  • 用res的最后一个元素跟interval判断是否有交集
    - 特殊情况,当res里没有元素的时候,用k==0判断,并且没有元素直接添加即可
  • 最后要截取res的前k个,否则会有[0,0],因为一开始就初始化跟intervals一样长 。Arrays.copyOfRange(res,0,k) 不包括下标为k的元素

代码

class Solution {
    public int[][] merge(int[][] intervals) {
        int n=intervals.length;
        
        int[][] res=new int[n][2];
        //做排序 借助 compartor lambda表达式
        Arrays.sort(intervals,(v1,v2)-> v1[0]-v2[0]);
        //计数,表示目前res中有几个元素
        int k=0;
        //迭代
        for(int[] interval:intervals){
            //因为第一次的时候,res还没有元素,所以用k==0进入第一次
            //只要第一个数字比之前的第二个数字大,就说明没有交集,那么直接添加新元素就行了
            if(k==0||interval[0]>res[k-1][1]){
                //k的位置跟用K时有影响,K++不能忘记
                k++;
                res[k-1]=interval;
            }
            //有交集的时候,比较第二个数谁大。修改res[k-1][1]就行了,不用添加新的
            else{    
                res[k-1][1]=Math.max(res[k-1][1],interval[1]);
            }
        }
        //如果截断到k,那么res会返回n个元素,并且后面有部分为[0,0];
        return Arrays.copyOfRange(res,0,k);
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值