57. 插入区间

给你一个 无重叠的 ,按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

示例 1:
输入:intervals = [[1,3],[6,9]], newInterval = [2,5]
输出:[[1,5],[6,9]]

示例2:
输入:intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
输出:[[1,2],[3,10],[12,16]]
解释:这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。

示例 3:
输入:intervals = [], newInterval = [5,7]
输出:[[5,7]]

示例 4:
输入:intervals = [[1,5]], newInterval = [2,3]
输出:[[1,5]]

示例 5:
输入:intervals = [[1,5]], newInterval = [2,7]
输出:[[1,7]]

提示:

  • 0 <= intervals.length <= 104
  • intervals[i].length == 2
  • 0 <=intervals[i][0] <= intervals[i][1] <= 105
  • intervals 根据 intervals[i][0] 按 升序 排列
  • newInterval.length == 2
  • 0 <= newInterval[0] <= newInterval[1] <= 105

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/insert-interval

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        if( intervals .length == 0 ) return new int[][] { newInterval } ;
        if( newInterval.length == 0 ) return intervals ;
        List<int[]> list = new ArrayList<>() ; 
        boolean flag = false ;
        if( intervals[ 0 ] [ 0 ] > newInterval[ 1 ] && intervals[ 0 ] [ 0 ] > newInterval[ 0 ] )list.add( newInterval ) ;
        for(int i = 0 ; i < intervals.length ; i ++) {
            if( !flag && i> 0 && intervals[ i ] [ 0 ] > newInterval[ 1 ] && intervals[ i -1  ] [ 1 ] < newInterval[ 0 ] ) {
                list.add( newInterval ) ;
            }
            if( intervals[ i ] [ 1 ] >= newInterval[ 0 ] && intervals[ i ] [ 0 ] <= newInterval[ 1 ]){
                newInterval[ 0 ] = newInterval[ 0 ] < intervals[ i ] [ 0 ] ? newInterval[ 0 ] : intervals[ i ] [ 0 ] ; 
                newInterval[ 1 ] = newInterval[ 1 ] > intervals[ i ] [ 1 ] ? newInterval[ 1 ] : intervals[ i ] [ 1 ] ;
                flag = true ; 
            }else{
                if(flag && intervals [ i ][ 0 ] > newInterval [ 1 ]){
                    list.add( newInterval ) ;
                    flag = !flag ; 
                    list.add( intervals [ i ] ) ;
                }else if(flag && intervals [ i ][ 1 ] < newInterval [ 0 ]){
                    list.add( intervals [ i ] ) ;
                    list.add( newInterval ) ;
                    flag = !flag ; 
                }else{
                    list.add( intervals [ i ] ) ;
                }
            }
        }
        if( ( intervals[ intervals.length - 1 ] [ 1 ] < newInterval[ 1 ] && intervals[ intervals.length - 1 ] [ 0 ] < newInterval[ 0 ] ) || flag ) list.add( newInterval ) ;
        int[][] res = new int[ list .size() ][ 2 ] ; 
        for( int i = 0 ; i < list.size() ; i ++ ) res[ i ] = list.get ( i ) ;
        return res;
    }
}

上一个代码太乱了,整理了一下,效率不变

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        if( intervals .length == 0 ) return new int[][] { newInterval } ;
        if( newInterval.length == 0 ) return intervals ;
        List<int[]> list = new ArrayList<>() ; 
        boolean flag = true ;
        for(int i = 0 ; i < intervals.length ; i ++) {
            if( flag ){
                if( intervals[ i ][ 0 ] > newInterval[ 1 ] && intervals[ i ][ 0 ] > newInterval[ 0 ]){
                    list.add( newInterval ) ;
                    flag = false ;
                    list.add( intervals[ i ] ) ;
                    continue ;
                }
                if(intervals [ i ] [ 1 ] < newInterval [ 0 ] ) list.add( intervals[i]);
                else if(intervals [ i ] [ 0 ] <= newInterval [ 1 ]){
                    newInterval [ 0 ] = Math.min ( newInterval [ 0 ] , intervals [ i ] [ 0 ] );
                    newInterval [ 1 ] = Math.max ( newInterval [ 1 ] , intervals [ i ] [ 1 ] );
                }else{
                    list.add( newInterval ) ;
                    flag = false ;
                    list.add( intervals[ i ] ) ;
                }
            }else list.add( intervals[ i ] ) ;
        }
        if( flag ) list.add( newInterval ) ;
        int[][] res = new int[ list .size() ][ ] ; 
        for( int i = 0 ; i < list.size() ; i ++ ) res[ i ] = list.get ( i ) ;
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

緣份い

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值