[leetcode/lintcode 题解] 阿里面试真题详解:插入区间

简介: [leetcode/lintcode 题解] 阿里面试真题详解:插入区间

描述
给出一个无重叠的按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

在线评测地址:领扣题库官网

样例1
输入:
(2, 5) into [(1,2), (5,9)]
输出:
[(1,9)]
样例2
输入:
(3, 4) into [(1,2), (5,9)]
输出:
[(1,2), (3,4), (5,9)]

算法:模拟
只要依次遍历,判断当前元素与要插入元素的关系。

  • 如当前元素的右端点小于插入元素的左端点,则说明当前元素与插入元素无交并。
  • 如当前元素的左端点大于插入元素的右端点,也说明当前元素与插入元素无交并。

依次遍历,判断当前元素与要插入元素的关系,找到插入点,插入这个新区间

  • 若是相交的,那么就停止比较,把要插入元素和当前元素合并成新区间

因为合并后的新区间也许和右边的元素有交集,会引起连锁反应,所以一直和右边的元素合并,直到无法合并为止
复杂度分析

  • 时间复杂度O(n)

    • n为数组的大小
  • 空间复杂度O(n)

    • n为数组的大小

代码

/**
 * Definition of Interval:
 * public classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this.start = start;
 *         this.end = end;
 *     }
 */
public class Solution {
    /*
     * @param intervals: Sorted interval list.
     * @param newInterval: new interval.
     * @return: A new interval list.
     */
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
        List<Interval> newIntervals = new ArrayList<Interval>();
        if(intervals.size() == 0){
            newIntervals.add(newInterval);
        }
        for (int i = 0; i < intervals.size(); i++) {
            // 如果新区间的结束值小于区间开始值,插在这里,后面续上
            if (newInterval.end < intervals.get(i).start) {
                newIntervals.add(newInterval);
                for (int j = i; j < intervals.size(); j++) {
                    newIntervals.add(intervals.get(j));
                }
                break;
            }
            // 如果新区间的开始值大于区间结束值,把当前区间加进去
            else if (newInterval.start > intervals.get(i).end) {
                newIntervals.add(intervals.get(i));
            }
            // 出现交叉,需要合并
            else {
                newInterval.start = Math.min(newInterval.start, intervals.get(i).start);
                newInterval.end = Math.max(newInterval.end, intervals.get(i).end);
            }
            // 最后只剩一个数据了,添加进去
            if(i == intervals.size() - 1){
                newIntervals.add(newInterval);
            }
        }
        return newIntervals;
    }
}

更多题解参考:九章官网solution

相关文章
|
6月前
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
5月前
|
负载均衡 架构师 Cloud Native
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选  CP 还是 AP?为什么?
|
6月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
217 2
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
324 4
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
2117 2