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

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

  • 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注
    在这里插入图片描述

  • 导航

    • LeetCode解锁1000题: 打怪升级之旅:每题都包括3-5种算法,以及详细的代码实现,刷题面试跳槽必备
    • 漫画版算法详解:通过漫画的形式和动态GIF图片把复杂的算法每一步进行详细可视解读,看一遍就掌握
    • python源码解读:解读python的源代码与调用关系,快速提升代码质量
    • python数据分析可视化:企业实战案例:企业级数据分析案例与可视化,提升数据分析思维和可视化能力
    • 程序员必备的数学知识与应用:全面详细的介绍了工程师都必备的数学知识

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

在本篇文章中,我们将详细解读力扣第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] 范围内。
    • 可以通过遍历数组,并检查相邻元素之间的差值来确定缺失的区间。
  2. 步骤

    • 初始化一个结果列表 result,用于存储缺失的区间。
    • 初始化一个变量 prev,表示前一个检查的元素,初始值为 lower - 1
    • 遍历数组 nums,对于每个元素 num,检查 numprev 之间的差值:
      • 如果差值等于2,则添加单个缺失的元素到结果列表。
      • 如果差值大于2,则添加一个区间到结果列表。
      • 更新 prev 为当前元素 num
    • 最后检查 prevupper 之间的差值,处理结束位置的缺失区间。
代码实现
def findMissingRanges(nums, lower, upper):result = []prev = lower - 1for num in nums:if num - prev == 2:result.append(str(prev + 1))elif num - prev > 2:result.append(f"{prev + 1}->{num - 1}")prev = numif 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. 初步分析

    • 利用双指针的方法来查找数组中缺失的区间。
    • 通过两个指针分别遍历数组的不同部分,将结果添加到结果列表中。
  2. 步骤

    • 初始化两个指针 leftright 分别指向数组的起始和结束。
    • 遍历数组,并检查每个指针之间的区间,找到缺失的区间。
    • 将缺失的区间添加到结果列表中。
代码实现
def findMissingRanges(nums, lower, upper):result = []left = lowerfor num in nums:if num > left:if num - left == 1:result.append(str(left))else:result.append(f"{left}->{num - 1}")left = num + 1if 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
  • 力扣官方题解

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

❤️❤️关注公众号 数据分析螺丝钉 回复 学习资料 领取高价值免费学习资料❥(^_-)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为OD机试 - 寻找最富裕的小家庭(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

C语言对一阶指针 二阶指针的本质理解

代码&#xff1a; #include <stdio.h>char a 2; char* p &a; char** d &p;int main(){printf("a -> %d, &a -> %p\n", a, &a);printf("*p -> %d, p -> %p, &p -> %p\n", *p, p, &p);printf(&qu…

【JavaEE初阶】网络初识|局域网和广域网|交换机和路由器|IP地址|端口号

&#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 关键概念 1.局域网LAN和广域网WAN &#xff08;1&#xff09;局域⽹&#xff0c;即Local Area Network&#xff0…

嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻嘻

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

【代码随想录】动态规划经典题

前言 更详细的在大佬的代码随想录 (programmercarl.com) 本系列仅是简洁版笔记&#xff0c;为了之后方便观看 做题步骤 含义公式初始化顺序检查 确定dp数组以及下标的含义递推公式dp数组如何初始化遍历顺序打印dp数组&#xff08;看哪里有问题&#xff09; 斐波那契数 c…

乐理学习-音及音名

1. 我觉得练习题很重要。我要得到一个反馈 所以我想没学习完书中的一节就要把练习题做下来&#xff0c;虽然慢点也可以。 2. 做个小计划。 今天计算了一下学完《基本乐理-李重光》如果每天3张。也要80天干完&#xff0c;希望能有一天可以学习7张的速度的时候。 3. 练习记录…

STM32H7系统窗口看门狗 (WWDG)应用方法介绍

目录 概述 1 认识窗口看门狗 (WWDG) 1.1 窗口看门狗定义 1.2 WWDG 主要特性 2 WWDG 功能说明 2.1 WWDG框图 2.2 WWDG 内部信号 2.3 控制递减计数器 2.4 看门狗中断高级特性 2.5 如何设置看门狗超时 3 WWDG 寄存器 3.1 控制寄存器 (WWDG_CR) 3.2 配置寄存器 (W…

MicroLED:苹果对知识产权的影响

Yole的洞察揭示&#xff0c;MicroLED IP在经历了七年的爆炸式增长后&#xff0c;已然屹立于行业之巅。苹果公司&#xff0c;作为微LED领域的先行者&#xff0c;早在2014年便敏锐地捕捉到Luxvue这家初创公司的潜力&#xff0c;将其纳入麾下&#xff0c;引发了业界的广泛关注。然…

【Springboot系列】SpringBoot 中的日志如何工作的,看完这一篇就够了

文章目录 强烈推荐引言Spring Boot 中的日志是怎么工作日志框架选择配置文件日志级别自定义日志配置集成第三方日志库实时监控和日志管理 Log4j2工作原理分析1. 核心组件2. 配置文件3. Logger的继承和层次结构4. 日志事件处理流程5. 异步日志 总结强烈推荐专栏集锦写在最后 强烈…

每日练习之矩阵乘法——斐波那契公约数

斐波那契公约数 题目描述 运行代码 #include <iostream> #include <vector> using namespace std; const long long mod 1000000007;// 矩阵乘法函数 vector<vector<long long>> matrixMultiply(const vector<vector<long long>>& …

移动端特效

一&#xff0c;触屏事件 1.触屏touch事件 2.触摸事件对象 如果侦听的是一个DOM元素&#xff0c;他俩是一样的 如果手指离开了&#xff0c;不能侦听到前两者&#xff0c;能侦听到第三个 我们一般都是触摸元素&#xff0c;所以一般都是第二个比较常用 第一个&#xff1a;屏幕…

Leetcode 力扣92. 反转链表 II (抖音号:708231408)

给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a;[1,4,3,2…

简单的基于信号处理的心电信号ECG特征波分割方法(MATLAB)

正常的心电图中&#xff0c;每个心跳周期内包含三个主要的特征波&#xff1a;&#xff30;波、QRS波和&#xff34;波&#xff0c;如下图所示。心电特征波能够反映心脏的生理状态信息&#xff0c;通过对其形状、幅值和持续时间的分析&#xff0c;可以用来辅助诊断心血管疾病。对…

vs2019 c++20 规范的 STL 库的智能指针 shared、unique 、weak 及 make_** 函数的源码注释汇总,和几个结论

智能指针的源码都在 《memory》 头文件中。因为头文件太长&#xff0c;再者本次整理是基于以前的零散的模板分析。故相当于抽取了该头文件中关于智能指针的源码进行分析&#xff0c;注释。 &#xff08;1 探讨一&#xff09;当独占指针指向数组时&#xff0c;其默认的删除器是…

mysql表约束基础 【default | 主键 | 外键 | 唯一键】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;表的约…

vue3快速入门(局部使用)

目录 前置知识JavaScript-导入导出 入门操作 变量渲染页面 局部使用vue的实现步骤 vue指令 v-for v-bind v-if v-show v-on v-model 生命周期 前置知识JavaScript-导入导出 正常情况在html导入js文件是全部导入&#xff0c;这样会导致性能上的损失 。 JS提供的…

STM32F1之OV7725摄像头·SCCB总线代码编写附带源码详解

STM32F1之OV7725摄像头-CSDN博客 STM32F1之OV7725摄像头像素数据输出时序、FIFO 读写时序以及摄像头的驱动原理详解-CSDN博客 目录 1. 硬件设计 1.1 SCCB 控制相关 1.2 VGA 时序相关 1.3 FIFO 相关 1.4 XCLK 信号 2. 代码设计 2.1 SCCB总线软件实现 2.1.1 宏定…

AI图书推荐:ChatGPT解码—人工智能增强生活指南

《ChatGPT解码—人工智能增强生活指南》&#xff08;ChatGPT Decoded. A Beginners Guide to AI-Enhanced Living &#xff09;是一本由 大卫维恩斯&#xff08;David Wiens &#xff09;所著的书籍&#xff0c;旨在帮助读者了解并有效利用GPT-4语言模型这一强大工具来提升日常…

springmvc Web上下文初始化

Web上下文初始化 web上下文与SerlvetContext的生命周期应该是相同的&#xff0c;springmvc中的web上下文初始化是由ContextLoaderListener来启动的 web上下文初始化流程 在web.xml中配置ContextLoaderListener <listener> <listener-class>org.springframework.…

ncnn 优化量化

问题&#xff1a;发现推理时间过长&#xff0c;需要优化 当前正在做人脸检测部署&#xff0c;发现检测速度有点吓人&#xff0c;以下监测的时间 gpu&#xff1a; cpu&#xff1a; gpu推理大概整体时间200多毫秒&#xff0c;cpu推理时间300多毫秒&#xff0c;这里暂时没去考虑…