【每日一题Day308】LC57插入区间 | 模拟

博客围绕LeetCode插入区间【LC57】问题展开。给定无重叠且按起始端点排序的区间列表,要插入新的区间并确保列表有序且无重叠。思路是先找插入位置,该位置前区间直接插入,之后的区间考虑重叠并合并。时间和空间复杂度均为O(n)。

插入区间【LC57】

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

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

  • 思路

    首先根据起始端点找到插入区间的位置,在该位置前的所有区间可以直接插入;该位置后的区间,需要考虑插入新区间后是否发生了重叠,如果发生了重叠那么合并区间

  • 实现

    class Solution {
        public int[][] insert(int[][] intervals, int[] newInterval) {
            List<int[]> res = new ArrayList<>();
            int n = intervals.length;
            // 先找到插入位置
            int i = -1;
            while (i + 1 < n && intervals[i + 1][0] < newInterval[0]){        
                i++;
                res.add(intervals[i]);
            }
            if (i == -1){
                res.add(newInterval);
                i++;
            }else {
                int[] pre = res.get(res.size() - 1);
                if (pre[1] >= newInterval[0]){// 有交叉
                    pre[1] = Math.max(pre[1], newInterval[1]);
                }else{
                    res.add(newInterval);
                }
            }
            for (; i < n; i++){
                int[] pre = res.get(res.size() - 1);
                if (pre[1] >= intervals[i][0]){// 有交叉
                    pre[1] = Math.max(pre[1], intervals[i][1]);
                }else{
                    res.add(intervals[i]);
                }
            }
            return res.toArray(new int[res.size()][]);
    
        }
    }
    
    • 复杂度

      • 时间复杂度: O ( n ) O(n) O(n),n为数组长度

      • 空间复杂度: O ( n ) O(n) O(n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值