大厂面试真题详解:合并区间

简介: 大厂面试真题详解:合并区间

给出若干闭合区间,合并所有重叠的部分。
在线评测地址:领扣题库官网

样例1:

输入: [(1,3)]
输出: [(1,3)]

样例 2:

输入:  [(1,3),(2,6),(8,10),(15,18)]
输出: [(1,6),(8,10),(15,18)]

解题思路

对应两个区间a, b,如何判断它们相交?
当a, b满足max(a.start,b.start)<=min(a.end,b.end)max(a.start,b.start)<=min(a.end,b.end)时,两者相交。
我们应考虑某种排序方式,使得所有相交的区间对应一段连续的数组下标,这样方便我们进行之后的合并操作。

这种排序方式应该是对区间的左端点按从小到大的方式进行排序,假设我们存在一个已经按照上面方式排序的数组:1,22,46,10。

可以看出,当我遍历数组的时候,每次访问一个区间ai,都能保证:如果ai和它前面的区间不相交,那么ai后面的任意区间都不能和ai前面的任意区间相交。这样就保证了时间复杂度为O(n)级别,即不会出现其他的遍历。

比如区间[5,7],他和前面的区间都没有相交,他后面的所有区间和它一样,没有和[5,7]前面的区间有交集。

代码思路

  1. 对区间数组按区间的左端点start排序。
  2. 将最后的区间赋值lastinterval为intervals[0]。
  3. 遍历输入,如果lastinterval和当前区间相交,合并两个区间。
  4. 如果不相交,将lastinterval加入结果,并将lastinterval赋值为当前的区间。

复杂度分析

设区间的个数为N。

时间复杂度

  • 排序的时间复杂度为O(NlogN)。
  • 遍历一遍数组的时间复杂度为O(N)。
  • 总时间复杂度为O(NlogN)。
    空间复杂度
  • 空间复杂度为O(n),可能存在每一个区间都不与任何一段区间相交,返回的答案和传入的参数长度相等。
public class Solution {
    /**
     * @param intervals: interval list.
     * @return: A new interval list.
     */
    public List<Interval> merge(List<Interval> intervals) {
        if (intervals.size() == 0) {
            return intervals;
        }
        
        // 根据区间的start值排序
        intervals.sort(Comparator.comparing(i -> i.start));
        
        List<Interval> result = new ArrayList<Interval>();
        Interval lastInterval = intervals.get(0);
        
        // 如果两段区间有交集的话,合并两段区间
        // 没有的话,将最后的区间加入答案,并令新的区间作为最后的区间
        for (Interval interval: intervals) {
            if (haveIntercation(lastInterval, interval)) {
                lastInterval = mergeTwoIntervals(lastInterval, interval);
            }
            else {
                result.add(lastInterval);
                lastInterval = interval;
            }
        }
        result.add(lastInterval);
        
        return result;
    }
    // 合并两段区间
    private Interval mergeTwoIntervals(Interval a, Interval b) {
        return new Interval(Math.min(a.start, b.start), Math.max(a.end, b.end));
    }
    // 判断区间是否有交集,要满足较大的start小于等于较小的end
    private boolean haveIntercation(Interval a, Interval b) {
        return Math.max(a.start, b.start) <= Math.min(a.end, b.end);
    }
}

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

相关文章
|
测试技术
【面试必刷TOP101】合并k个已排序的链表 & 判断链表中是否有环
【面试必刷TOP101】合并k个已排序的链表 & 判断链表中是否有环
69 0
【面试必刷TOP101】反转链表 & 链表内指定区间反转
【面试必刷TOP101】反转链表 & 链表内指定区间反转
58 0
|
5月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
6月前
|
SQL 数据挖掘 数据处理
「SQL面试题库」 No_88 找到连续区间的开始和结束数字
「SQL面试题库」 No_88 找到连续区间的开始和结束数字
|
存储 算法
LeetCode150道面试经典题-合并两个有序数组(简单)
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
61 0
|
Serverless C语言 索引
华为面试C语言真题(二)
华为面试C语言真题( 二)
303 1
华为面试C语言真题(二)
|
安全 测试技术 Python
软件测试面试题及答案,这个题库有3千多道最新面试真题可以刷
相信对于很多软件测试新手来说,技术项目的面试是十分让人头疼的,生怕没回答得好,就会跟这个offer失之交臂
202 0
|
存储
合并两个排序的链表(面试常考,非常重要)
合并两个排序的链表(面试常考,非常重要)
93 0
合并两个排序的链表(面试常考,非常重要)
|
设计模式 缓存 算法
腾讯Java高级岗180道面试真题,面试大厂拿45Koffer没问题!
一、数据结构与算法基础 · 说一下几种常见的排序算法和分别的复杂度。 · 用Java写一个冒泡排序算法 · 描述一下链式存储结构。 · 如何遍历一棵二叉树? · 倒排一个LinkedList。 · 用Java写一个递归遍历目录下面的所有文件
|
消息中间件 NoSQL 网络协议
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享
应广大读者要求,今天开更一些大厂的面经和相关的面试干货,下面这份**最新字节跳动春招面经+笔记**带给大家。
151 0
字节跳动三面Java经历,砍下年薪50W的Offer,面试真题整理分享