【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)

简介: 【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣!

期待与您一起探索技术、持续学习、一步步打怪升级 欢迎订阅本专栏❤️❤️

在本篇文章中,我们将详细解读力扣第163题“缺失的区间”。通过学习本篇文章,读者将掌握如何使用多种方法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释和ASCII图解,以便于理解。

问题描述

力扣第163题“缺失的区间”描述如下:

给定一个排序的整数数组 nums 和两个整数 lowerupper,返回数组中缺失的区间。缺失的区间指的是 nums 中没有出现并且在 [lower, upper] 范围内的整数区间。

示例 1:

输入: nums = [0, 1, 3, 50, 75], lower = 0, upper = 99
输出: ["2", "4->49", "51->74", "76->99"]

示例 2:

输入: nums = [], lower = 1, upper = 1
输出: ["1"]

示例 3:

输入: nums = [], lower = -3, upper = -1
输出: ["-3->-1"]

示例 4:

输入: nums = [-1], lower = -1, upper = -1
输出: []

解题思路

方法一:线性扫描
  1. 初步分析
  • 需要找出数组中缺失的区间,并且这些区间要在 [lower, upper] 范围内。
  • 可以通过遍历数组,并检查相邻元素之间的差值来确定缺失的区间。
  1. 步骤
  • 初始化一个结果列表 result,用于存储缺失的区间。
  • 初始化一个变量 prev,表示前一个检查的元素,初始值为 lower - 1
  • 遍历数组nums,对于每个元素num,检查numprev之间的差值:
  • 如果差值等于2,则添加单个缺失的元素到结果列表。
  • 如果差值大于2,则添加一个区间到结果列表。
  • 更新 prev 为当前元素 num
  • 最后检查 prevupper 之间的差值,处理结束位置的缺失区间。
代码实现
def findMissingRanges(nums, lower, upper):
    result = []
    prev = lower - 1
    for num in nums:
        if num - prev == 2:
            result.append(str(prev + 1))
        elif num - prev > 2:
            result.append(f"{prev + 1}->{num - 1}")
        prev = num
    if upper - prev == 1:
        result.append(str(prev + 1))
    elif upper - prev > 1:
        result.append(f"{prev + 1}->{upper}")
    return result
# 测试案例
print(findMissingRanges([0, 1, 3, 50, 75], 0, 99))  # 输出: ["2", "4->49", "51->74", "76->99"]
print(findMissingRanges([], 1, 1))  # 输出: ["1"]
print(findMissingRanges([], -3, -1))  # 输出: ["-3->-1"]
print(findMissingRanges([-1], -1, -1))  # 输出: []
ASCII图解

假设输入数组为 [0, 1, 3, 50, 75]lower = 0upper = 99,图解如下:

初始状态:
nums: [0, 1, 3, 50, 75]
lower: 0, upper: 99
prev: -1
遍历过程:
num = 0, prev = -1, 差值 = 1, 无缺失
num = 1, prev = 0, 差值 = 1, 无缺失
num = 3, prev = 1, 差值 = 2, 缺失单个元素 "2"
num = 50, prev = 3, 差值 = 47, 缺失区间 "4->49"
num = 75, prev = 50, 差值 = 25, 缺失区间 "51->74"
结束检查:
upper = 99, prev = 75, 差值 = 24, 缺失区间 "76->99"
最终结果:
["2", "4->49", "51->74", "76->99"]

方法二:使用双指针法

  1. 初步分析
  • 利用双指针的方法来查找数组中缺失的区间。
  • 通过两个指针分别遍历数组的不同部分,将结果添加到结果列表中。
  1. 步骤
  • 初始化两个指针 leftright 分别指向数组的起始和结束。
  • 遍历数组,并检查每个指针之间的区间,找到缺失的区间。
  • 将缺失的区间添加到结果列表中。
代码实现
def findMissingRanges(nums, lower, upper):
    result = []
    left = lower
    for num in nums:
        if num > left:
            if num - left == 1:
                result.append(str(left))
            else:
                result.append(f"{left}->{num - 1}")
        left = num + 1
    if left <= upper:
        if left == upper:
            result.append(str(left))
        else:
            result.append(f"{left}->{upper}")
    return result
# 测试案例
print(findMissingRanges([0, 1, 3, 50, 75], 0, 99))  # 输出: ["2", "4->49", "51->74", "76->99"]
print(findMissingRanges([], 1, 1))  # 输出: ["1"]
print(findMissingRanges([], -3, -1))  # 输出: ["-3->-1"]
print(findMissingRanges([-1], -1, -1))  # 输出: []
ASCII图解

假设输入数组为 [0, 1, 3, 50, 75]lower = 0upper = 99,图解如下:

初始状态:
nums: [0, 1, 3, 50, 75]
lower: 0, upper: 99
left: 0
遍历过程:
num = 0, left = 0, 无缺失
num = 1, left = 1, 无缺失
num = 3, left = 2, 缺失单个元素 "2"
num = 50, left = 4, 缺失区间 "4->49"
num = 75, left = 51, 缺失区间 "51->74"
结束检查:
left = 76, upper = 99, 缺失区间 "76->99"
最终结果:
["2", "4->49", "51->74", "76->99"]

复杂度分析

  • 时间复杂度
  • 线性扫描法:O(n),其中 n 是数组 nums 的长度。遍历数组一次即可完成缺失区间的计算。
  • 双指针法:O(n),其中 n 是数组 nums 的长度。遍历数组一次即可完成缺失区间的计算。
  • 空间复杂度
  • 两种方法均为 O(1),除了存储结果的列表外,只使用了常数空间来存储变量。

模拟面试问答

问题 1:你能描述一下如何解决这个问题的思路吗?

回答:当然。我们需要找到排序数组 nums 中在 [lower, upper] 范围内缺失的区间。通过遍历数组,我们可以检查相邻元素之间的差值,如果差值大于1,则表示存在缺失的区间。我们需要处理数组起始位置和结束位置的特殊情况,以确保所有缺失区间都能被找到。

问题 2:如果数组是空的,你的算法会如何处理?

回答:如果数组是空的,我们只需检查整个 [lower, upper] 范围是否为一个缺失的区间。如果 lowerupper 相等,则缺失一个元素。如果 lowerupper 不相等,则缺失一个区间。

问题 3:你能解释一下你的代码是如何处理数组起始位置和结束位置的特殊情况的吗?

回答:在代码中,我们首先初始化 prevlower - 1,这样在第一次遍历时可以正确检查起始位置的缺失区间。在遍历结束后,我们检查 prevupper 之间的差值,处理结束位置的缺失区

间。如果 prevupper 之间存在缺失元素或区间,我们将其添加到结果列表中。

总结

本文详细解读了力扣第163题“缺失的区间”,通过线性扫描法和双指针法两种方法,高效地解决了这一问题,并提供了详细的ASCII图解和模拟面试问答。希望读者通过本文的学习,能够在力扣刷题的过程中更加得心应手。

参考资料

  • 《算法导论》—— Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein
  • 力扣官方题解

🌹🌹如果觉得这篇文对你有帮助的话,记得一键三连关注、赞👍🏻、收藏是对作者最大的鼓励,非常感谢 ❥(^_-)

❤️❤️关注公众号 数据分析螺丝钉 回复 学习资料 领取高价值免费学习资料❥(^_-)

欢迎关注微信公众号 数据分析螺丝钉

相关文章
|
9月前
|
存储 缓存 NoSQL
Redis常见面试题全解析
Redis面试高频考点全解析:从过期删除、内存淘汰策略,到缓存雪崩、击穿、穿透及BigKey问题,深入原理与实战解决方案,助你轻松应对技术挑战,提升系统性能与稳定性。(238字)
|
11月前
|
存储 安全 测试技术
Python面试题精选及解析
本文详解Python面试中的六大道经典问题,涵盖列表与元组区别、深浅拷贝、`__new__`与`__init__`、GIL影响、协程原理及可变与不可变类型,助你提升逻辑思维与问题解决能力,全面备战Python技术面试。
623 1
|
Web App开发 缓存 前端开发
浏览器常见面试题目及详细答案解析
本文围绕浏览器常见面试题及答案展开,深入解析浏览器组成、内核、渲染机制与缓存等核心知识点。内容涵盖浏览器的主要组成部分(如用户界面、呈现引擎、JavaScript解释器等)、主流浏览器内核及其特点、从输入URL到页面呈现的全过程,以及CSS加载对渲染的影响等。结合实际应用场景,帮助读者全面掌握浏览器工作原理,为前端开发和面试提供扎实的知识储备。
467 4
|
9月前
|
监控 Java 关系型数据库
面试性能测试总被刷?学员真实遇到的高频问题全解析!
面试常被性能测试题难住?其实考的不是工具,而是分析思维。从脚本编写到瓶颈定位,企业更看重系统理解与实战能力。本文拆解高频面试题,揭示背后考察逻辑,并通过真实项目训练,帮你构建性能测试完整知识体系,实现从“会操作”到“能解决问题”的跨越。
|
存储 安全 Java
2025 最新史上最全 Java 面试题独家整理带详细答案及解析
本文从Java基础、面向对象、多线程与并发等方面详细解析常见面试题及答案,并结合实际应用帮助理解。内容涵盖基本数据类型、自动装箱拆箱、String类区别,面向对象三大特性(封装、继承、多态),线程创建与安全问题解决方法,以及集合框架如ArrayList与LinkedList的对比和HashMap工作原理。适合准备面试或深入学习Java的开发者参考。附代码获取链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
6406 50
|
前端开发 JavaScript 开发者
2025 最新 100 道 CSS 面试题及答案解析续篇
本文整理了100道CSS面试题及其答案,涵盖CSS基础与进阶知识。内容包括CSS引入方式、盒模型、选择器优先级等核心知识点,并通过按钮、卡片、导航栏等组件封装实例,讲解单一职责原则、样式隔离、响应式设计等最佳实践。适合前端开发者巩固基础、备战面试或提升组件化开发能力。资源地址:[点击下载](https://pan.quark.cn/s/50438c9ee7c0)。
277 5
2025 最新 100 道 CSS 面试题及答案解析续篇
|
NoSQL Java 微服务
2025 年最新 Java 面试从基础到微服务实战指南全解析
《Java面试实战指南:高并发与微服务架构解析》 本文针对Java开发者提供2025版面试技术要点,涵盖高并发电商系统设计、微服务架构实现及性能优化方案。核心内容包括:1)基于Spring Cloud和云原生技术的系统架构设计;2)JWT认证、Seata分布式事务等核心模块代码实现;3)数据库查询优化与高并发处理方案,响应时间从500ms优化至80ms;4)微服务调用可靠性保障方案。文章通过实战案例展现Java最新技术栈(Java 17/Spring Boot 3.2)的应用.
1020 9
|
缓存 NoSQL Java
Java Redis 面试题集锦 常见高频面试题目及解析
本文总结了Redis在Java中的核心面试题,包括数据类型操作、单线程高性能原理、键过期策略及分布式锁实现等关键内容。通过Jedis代码示例展示了String、List等数据类型的操作方法,讲解了惰性删除和定期删除相结合的过期策略,并提供了Spring Boot配置Redis过期时间的方案。文章还探讨了缓存穿透、雪崩等问题解决方案,以及基于Redis的分布式锁实现,帮助开发者全面掌握Redis在Java应用中的实践要点。
677 6
|
设计模式 安全 Java
Java 基础知识面试题全解析之技术方案与应用实例详解
本内容结合Java 8+新特性与实际场景,涵盖函数式编程、Stream API、模块化、并发工具等技术。通过Lambda表达式、Stream集合操作、Optional空值处理、CompletableFuture异步编程等完整示例代码,助你掌握现代Java应用开发。附面试题解析与技术方案,提升实战能力。代码示例涵盖计算器、员工信息统计、用户查询、模块化系统设计等,助你轻松应对技术挑战。
355 9
|
缓存 Java 索引
2025 年 Java 面试必备最常见 200 + 面试题及答案解析
这是一份针对Java面试的综合技术方案与应用实例文档,涵盖Java基础(JDK/JRE、字符串、IO流)、容器(ArrayList/LinkedList、HashMap)、多线程(线程创建、同步、线程池)、数据库(MySQL索引、Redis缓存穿透)及Spring框架(IOC容器、热部署)等核心模块。通过详细解析常见面试题,帮助读者深入理解并掌握Java核心技术,为应对面试提供全面指导。此外,还涉及反射、设计模式、JVM调优等进阶内容,助力开发者全面提升技能。代码示例可从提供的链接下载。
1521 6

推荐镜像

更多
  • DNS