合并区间java实现

class Solution {
    public int[][] merge(int[][] intervals) {
        //首先根据每个区间的第一个下标对二维数组排序
        Arrays.sort(intervals,(e1,e2)->e1[0] - e2[0]);
        ArrayList<int[]> merge = new ArrayList<>();
        //排序完成之后保证了下一个区间的起始位置一定时大于等于前一个区间的起始位置
        //合并区间的条件时前一个区间的起始位置小于的等于后一个区间的起始位置,并且后一个区间的起始位置大于等于前一个区间的结束位置,排序之后的二维数组天然满足第一个条件
        //开始和并区间
        for(int i = 0;i < intervals.length;){
            //先记录第一个区间的起始和结束位置
            int[] temp = new int[]{intervals[i][0],intervals[i][1]};
            int j = i + 1;
            //合并从该区间开始所有可以合并的区间,直到遇到一个不能合并的区间开始下一次的合并工作
            //第一个条件是为了避免二维数组中只有一个区间的情况
            while(j < intervals.length && temp[1] >= intervals[j][0]){
                temp[1] = Math.max(temp[1],intervals[j][1]);
                j++;
            }
            //合并结束后将区间加入结果集合
            merge.add(temp);
            //下一次循环需要合并的就是当前的j所在的位置
            i = j;
        }
        //处理结果集合并返回
        int[][] result = new int[merge.size()][];
        return merge.toArray(result);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值