合并区间

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

首先,要考虑数组为空的情况

if( intervals.length == 0){
    return new int[0][];
}

如果数组长度为空,那么输出一个空的2维数组。

如果要合并,先对它进行一个排序,应该时按照每个区间的start来按照升序排序,这样可以从最小的数进行排序。

 Arrays.sort(intervals, new Comparator<int[]>(){

            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0] - o2[0];
            }
        });

如果按照当前的往后找,那我们会发现不好规定后一个数,于是我们用

pre = intervals[0]

同时引入一个标记j

j = 0

然后,应该按照以下原则合并

如果当前的数的start小于等于前一个数的end,那么合并,否则将前一个数单独拿出来放入intervals中,更行pre为当前intervals

 for(int i = 1; i < intervals.length; i++){
            int[] cur = intervals[i];
            if(cur[0] <= pre[1]){
                int m = Math.max(pre[1], cur[1]);
                pre = new int[]{pre[0], m};
            }
            else{
                intervals[j++] = pre;
                pre = cur;
            }
        }

考虑靠合并情况下不需要每一个向intervals,应该需要一放在末尾

intervals[j++] = pre

最后只用返回0到j-1的内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值