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

news2024/11/17 0:38:26

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

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

  • 导航

    • 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 - 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. 初步分析

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

    • 初始化两个指针 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
  • 力扣官方题解

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

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

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

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

相关文章

文盘Rust -- 生命周期问题引发的 static hashmap 锁

100编程书屋_孔夫子旧书网 2021年上半年,撸了个rust cli开发的框架,基本上把交互模式,子命令提示这些cli该有的常用功能做进去了。项目地址:https://github.com/jiashiwen/interactcli-rs。 春节以前看到axum已经0.4.x了,于是想看看能不能用rust做个服务端的框架。 春节…

C++的哈希 哈希表 哈希桶

目录 Unordered系列关联式容器 什么是哈希 哈希表 闭散列 载荷因子α 扩容 查找 删除 字符串哈希算法 最终代码 开散列 插入 查找 删除 最终代码 完整代码 Unordered系列关联式容器 C98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0…

浅谈Docker容器的网络通信原理

文章目录 1、回顾容器概念2、容器网络3、容器与主机之间的网络连通4、交换机的虚拟实现---虚拟网桥&#xff08;Bridge&#xff09;5、Docker 守护进程daemon管理容器网络 1、回顾容器概念 我们知道容器允许我们在同一台宿主机&#xff08;电脑&#xff09;上运行多个服务&…

【蓝桥杯省赛真题44】python计算N+N的值 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析

目录 python计算NN的值 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算NN的值 第十四届蓝桥杯青少年组python省赛真题 一、题目要求…

VMware安装Ubuntu系统(超详细)

一.Ubuntu官网下载镜像 Ubuntu官网&#xff1a;Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机&#xff08;ControlN&#xff09;&#xff0c;这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…

PanTools v1.0.25 多网盘批量管理工具 批量管理、分享、转存、重命名、复制...

一款针对多个热门网盘的文件管理、批量分享、批量转存、批量复制、批量重命名、批量链接检测、跨账号移动文件、多账号文件搜索等&#xff0c;支持不同网盘的不同账号的资源文件操作。适用于网站站长、资源爱好者等&#xff0c;对于管理名下具有多个网盘多个账号具有实用的效果…

这方法真牛B!论文降重从81%直降1.9%

目录 一、万字论文&#xff0c;从0到1&#xff0c;只需1小时二、获取途径三、论文从81&#xff05;降到1.9&#xff05;四、内容是别人的&#xff0c;话是自己的五、AI工具 --> 中文论文降重六、论文降重小技巧 一、万字论文&#xff0c;从0到1&#xff0c;只需1小时 通过O…

Github 2024-05-27 开源项目周报Top15

根据Github Trendings的统计,本周(2024-05-27统计)共有15个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目6Rust项目3Python项目3JavaScript项目3Java项目1C#项目1C++项目1Cuda项目1C项目1Lua项目1JavaScript算法与数据结构 创建周期:2…

读人工智能时代与人类未来笔记15_改变人类经验

1. 认识世界的方式 1.1. 信仰 1.2. 理性 1.2.1. 理性不仅革新了科学&#xff0c;也改变了我们的社会生活、艺术和信仰 1.2.2. 在其浸染之下&#xff0c;封建等级制度瓦解了&#xff0c;而民主&#xff0c;即理性的人应该自治的理念崛起了 1.3. 人工智能 1.3.1. 这种转变将…

关于我转生从零开始学C++这件事:升级Lv.25

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ OK了老铁们&#xff0c;又是一个周末&#xff0c;大伟又来继续给大家更新我们的C的内容了。那么根据上一篇博…

Spring Boot 项目统一异常处理

在 Spring Boot 项目开发中&#xff0c;异常处理是一个非常重要的环节。良好的异常处理不仅能提高应用的健壮性&#xff0c;还能提升用户体验。本文将介绍如何在 Spring Boot 项目中实现统一异常处理。 统一异常处理有以下几个优点&#xff1a; 提高代码可维护性&#xff1a;…

每日AIGC最新进展(12):在舞蹈视频生成中将节拍与视觉相融合、Text-to-3D综述、通过内容感知形状调整进行 3D 形状增强

Diffusion Models专栏文章汇总&#xff1a;入门与实战 Dance Any Beat: Blending Beats with Visuals in Dance Video Generation https://DabFusion.github.io 本文提出了一种名为DabFusion的新型舞蹈视频生成模型&#xff0c;该模型能够根据给定的静态图像和音乐直接生成舞蹈…

优化FPGA SelectIO接口VREF生成电路

引言&#xff1a;FPGA设计中使用了各种PCB SelectIO™接口VREF生成电路。有时即使在以前的设计中已经成功的在电路板上设计了VREF生成电路&#xff0c;也会在VREF引脚上发现大量噪声&#xff08;200–400mV&#xff09;。大量VREF噪声的存在可能导致高性能SelectIO接口&#xf…

Jenkins部署成功后自动发通知到钉钉群

钉钉上如何配置 选择钉钉群&#xff0c;找到群设置-机器人-添加机器人 选择自定义 选择【添加】 选择【加签】&#xff0c;复制值&#xff0c;后续在jenkins里配置时会用到 复制Webhook地址&#xff0c;后面在jenkins里配置的时候要用到 Jenkins上如何配置 系统管理-插件管…

Vue3实战笔记(46)—Vue 3高效开发定制化Dashboard的权威手册

文章目录 前言Dashboard开发总结 前言 后台管理系统中的Dashboard是一种图形化的信息显示工具&#xff0c;通常用于提供一个特定领域或系统的概况。它可以帮助用户监控和分析数据&#xff0c;快速获取重要信息。可以帮助用户监控业务状况、分析数据、获取关键信息和管理资源。…

PyTorch学习笔记:新冠肺炎X光分类

前言 目的是要了解pytorch如何完成模型训练 https://github.com/TingsongYu/PyTorch-Tutorial-2nd参考的学习笔记 数据准备 由于本案例目的是pytorch流程学习&#xff0c;为了简化学习过程&#xff0c;数据仅选择了4张图片&#xff0c;分为2类&#xff0c;正常与新冠&#xf…

Golang | Leetcode Golang题解之第114题二叉树展开为链表

题目&#xff1a; 题解&#xff1a; func flatten(root *TreeNode) {curr : rootfor curr ! nil {if curr.Left ! nil {next : curr.Leftpredecessor : nextfor predecessor.Right ! nil {predecessor predecessor.Right}predecessor.Right curr.Rightcurr.Left, curr.Righ…

95.网络游戏逆向分析与漏洞攻防-ui界面的设计-ui的设计与架构

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果&#xff0c;代码看不懂是正常的&#xff0c;只要会抄就行&#xff0c;抄着抄着就能懂了 内容…

JVM之【运行时数据区】

JVM简图 运行时数据区简图 一、程序计数器&#xff08;Program Counter Register&#xff09; 1.程序计数器是什么&#xff1f; 程序计数器是JVM内存模型中的一部分&#xff0c;它可以看作是一个指针&#xff0c;指向当前线程所执行的字节码指令的地址。每个线程在执行过程中…

通过acme.sh和cloudflare实现免费ssl证书自动签发

参考使用acme.sh通过cloudflare自动签发免费ssl证书 | LogDicthttps://www.logdict.com/archives/acme.shshi-yong-cloudflarezi-dong-qian-fa-mian-fei-sslzheng-shu