LCR 173:在点名(二分查找) —— 题解
欢迎阅读 欢迎来到「点名」题解之旅本文将带你从点名时发现学号缺了一个这一直观场景出发深入理解二段性二分的巧妙运用并掌握如何比较元素与下标是否相等来定位缺失的学号。在开始之前建议你先了解题目背景这是 LCR 173 题给定递增数组records其元素本应为0 ~ n的连续整数但缺失了一个数字找出它。本质上缺失位置之前满足records[i] i之后满足records[i] ! i问题转化为二分找到第一个下标与值不相等的位置。明确学习目标掌握下标-值比较二分理解缺失在中间与缺失在末尾两种情形的区分并熟练处理单元素数组等边界情况。准备好环境建议在本地 IDE 或 LeetCode 在线编辑器中打开代码边看边运行亲手验证示例如records [0,1,2,3,5]输出4records [0,1,2,3,4]输出5。本文将从问题转化、下标比较、区间收缩、结果校验到代码实现层层递进。即使你对二段性二分还不熟悉我们也会从谁和座号对不上谁就是缺席者这一直觉出发让你轻松抓住核心思想——下标值相等为左段不等即缺失。现在让我们一起二分点名找出那个缺勤的学号吧 一.题目LCR 173. 点名 - 力扣LeetCode​二.做题思路一、问题分析前置分析题目要求在递增数组records中找出缺失的那个整数元素本应为0 ~ n连续缺失一个。关键约束数组严格递增元素范围[0, n1]内缺一个缺失数字可能在中间也可能在末尾。核心思路利用二段性——缺失位置前满足records[i] i缺失位置后满足records[i] i 1整体右移一位二分找第一个records[i] ! i的位置。二、算法策略下标-值比较二分核心步骤初始化区间n records.size() - 1数组最后一个下标、left 0、right n在[0, n]上二分。二分收敛while (left right)mid下取整left (right - left) / 2。下标比较mid records[mid]→ 前mid1个元素全部正确缺失在右半left mid 1mid ! records[mid]→ 缺失在左半含 midright mid。结果校验收敛后若records[left] left说明缺失的是末尾数字n 1返回left 1否则返回left。示例执行过程records [0,1,2,3,5]缺失 4阶段leftrightmidrecords[mid] vs mid操作结果①0422 2左段正确收缩左侧left3②3433 3左段正确收缩左侧left4收敛44—records[4]5 ! 4返回 44三、正确性说明简单版本二段性成立数组只缺一个数字缺失位置前所有元素满足records[i] i之后所有元素满足records[i] i整体右移两种状态只切换一次判据mid records[mid]恰好识别分界不会误判。收缩方向正确相等说明左段完好缺失在右半可丢弃左段不等说明缺失在左半含 mid保留 mid 向左收敛。区间单调收敛到第一个不等位置不漏解。末尾缺失校验完备若全部相等缺失的是最后一位n1二分会收敛到right n此时records[left] left恒成立返回left 1恰好是缺失值覆盖末尾情形。终止性left mid 1与right mid下取整保证mid right均严格缩小不会死循环。四、实现细节边界防护初始化n records.size() - 1数组最后一个下标非元素个数、left 0、right n。边界防护size 1时如[0]right 0循环不进入records[0] 0→ 返回 1records[left]访问安全left ≤ n ≤ size-1缺失在末尾时靠校验分支兜底。复杂度时间 O(log n)每次排除一半空间 O(1)仅常数个变量。关键判断if (mid records[mid]) left mid 1; else right mid;二段性收敛、if (records[left] left) return left 1;末尾缺失校验。五、返回值目标映射返回left或left 1缺失的数字对应题目返回缺席的学号。三.代码class Solution { public: int takeAttendance(vectorint records) { int n records.size() - 1; // 数组最后一个下标搜索区间右端点 int left 0; int right n; // 1. 二段性二分比较元素与下标找“第一个 records[i] ! i”的位置 while (left right) { int mid left (right - left) / 2; // mid 下取整配合 right mid if (mid records[mid]) { left mid 1; // 前 mid1 个元素全部正确缺失在右半 } else { right mid; // 已出现错位缺失在左半含 mid } } // 2. 结果校验区分“缺失在中间”与“缺失在末尾” if (records[left] left) { return left 1; // 全部元素都与下标相等缺失的是末尾数字 } return left; // 第一个错位下标即缺失数字 } };四、易错点分析难点1n records.size() - 1的含义极易混淆int n records.size() - 1; // 注意这是“最后一个下标”不是元素个数 int right n;这里的n是数组最后一个下标搜索右端点而缺失数字的取值范围是[0, size]。若误把n当成元素个数records.size()right会越界一位收敛后records[left]访问越界UB。理解搜索区间是下标域 [0, size-1]缺失值域是 [0, size]是正确写对边界的前提。难点2判据mid records[mid]的语义是左段完好if (mid records[mid]) left mid 1; // 跳过 midrecords[mid] mid说明前 mid1 个元素全部与下标相等数组递增且只缺一个错位只会在之后发生因此缺失必在[mid1, right]left mid 1跳过 mid 是安全的。若误写成left mid当所有元素都正确时left卡在size-1无法前进死循环left right恒成立但 left 不再增大实际 leftmid 且 midleft 时区间不缩小。难点3else 分支right mid保留 mid 的原因else right mid; // records[mid] ! mid缺失在 [left, mid] 内records[mid] ! mid时mid 可能是第一个错位位置即缺失值也可能在其右侧但缺失一定不在 mid 之后递增性mid 之后的值都 ≥ records[mid]1 mid1错位更明显但第一个错位在 mid 或更左。保留 mid 向左收敛不会漏掉第一个错位点。难点4末尾缺失必须靠records[left] left兜底if (records[left] left) return left 1; // 全部相等 → 缺失的是 n1若缺失的是最后一个数字如[0,1,2,3,4]缺 5数组内所有元素都与下标相等二分一路left mid 1收敛到left size-1。此时若直接return left会误返回 size-1必须校验records[left] left后返回left 1——这个校验分支是末尾缺失情形的唯一出口漏掉即错。五、流程图 闭幕 恭喜你完成了「点名」问题的学习为了巩固知识并进一步拓展建议你动手实践在 LeetCode 上提交代码尝试不同的测试用例。深入思考本题通过比较records[mid]与下标mid来判断缺失位置。为什么这种比较能揭示缺失信息其背后的“元素与下标对应关系”在有序无重复场景下具有什么特性循环结束后代码额外校验if (records[left] left) return left 1;。这个分支处理的是什么情况如果不加这个校验直接返回left在什么场景下会出错时间复杂度 O(log n)如果改用异或运算或求和公式时间复杂度也是 O(n)相比二分哪种方案更优为什么本题要求用二分延伸挑战如果数组长度不固定且缺失的数字可能出现在任意位置包括开头和末尾当前的二分框架是否依然适用如果数组中的数字不是从 0 开始例如从 1 到 n缺失一个你如何修改比较条件来适配这种偏移如果你觉得本文对你有所帮助欢迎点赞 / 收藏关注作者获取更多题解留言交流你的疑问或优化思路深入思考答案比较records[mid]与mid的有效性因为数组是 0~n 范围内的不重复升序排列若左侧元素全部正确则records[i] i对i k恒成立一旦出现错位缺失数字就在该位置此后所有元素都比下标大 1形成“左段正确、右段错位”的二段性。当mid ! records[mid]时说明mid已经位于错位段缺失一定在mid或其左侧因此right mid向左收缩不会丢失缺失数字。异或或求和 O(n) 比 O(log n) 慢但更简单本题要求二分是为了训练二段性思维且 O(log n) 更高效。延伸挑战答案挑战1若缺失位置任意开头或末尾只要数组仍是 0~n 的不重复升序排列当前二分完全适用因为二段性依然存在开头缺失则第一个元素就不等于0mid比较立即触发错位分支。挑战2若数组从 1 开始即应有records[i] i 1只需将比较条件改为mid 1 records[mid]其余收敛逻辑不变即可适配任意偏移。祝你在算法之路上越走越稳早日攻克每一道难题下次见 ✨

相关新闻

标尺在手,定量不愁:从土壤到肠道,绝对定量微生物一测到底

标尺在手,定量不愁:从土壤到肠道,绝对定量微生物一测到底

为什么你的菌群数据可能“骗”了你?在微生物组研究中,扩增子与宏基因组测序虽可解析菌群结构,却受限于相对丰度数据,难以区分真实丰度变化与比例偏移。引入绝对定量校正(如Spike-in内标),可精准…

2026/8/26 18:47:25 阅读更多 →
上线千舟报修云前后,景洪市民族中学后勤工作发生了什么?

上线千舟报修云前后,景洪市民族中学后勤工作发生了什么?

景洪市民族中学为边疆地区公办民族中学,涵盖教学楼、多民族学生公寓、食堂、运动场地,学生民族构成多元,宿舍、教学设施报修分散,选用千舟报修云作为校园报修系统首选,推进智慧后勤建设。 改造前:传统后勤报…

2026/8/26 18:47:25 阅读更多 →
深入理解 AI Agent · AGENT #03:从单 Agent 到多 Agent

深入理解 AI Agent · AGENT #03:从单 Agent 到多 Agent

📘 《深入理解 AI Agent》系列 第八篇 | AGENT-03 前篇回顾:Agent 基础篇 #01 从LLM到Agent → Agent 基础篇 #02 四大核心机制 → Agent 基础篇 #03 从单Agent到多Agent 开篇:单 Agent 能走多远? 做 AI Agent 的开发者常有一个…

2026/8/26 18:46:25 阅读更多 →

最新新闻

软件资产黑洞:百万预算去哪了

软件资产黑洞:百万预算去哪了

摘要制造企业的软件预算流失,常常不是因为单次采购决策失误,而是软件安装、许可证占用、部门使用和审计证据长期不可见。CIO 要找到“百万预算去哪了”,需要先把软件资产从分散台账变成可盘点、可追踪、可治理的数据资产。预算黑洞通常藏在日…

2026/8/26 19:20:15 阅读更多 →
Scalable Scientific Interest Profiling Using Large Language Models

Scalable Scientific Interest Profiling Using Large Language Models

文章总结与翻译 一、文章主要内容 该研究聚焦科研人员学术兴趣画像更新滞后的问题,提出并评估了两种基于大型语言模型(LLMs)的自动化、可扩展生成方法,以解决传统人工维护学术画像耗时且易过时的痛点,具体内容如下: 研究背景:现有学术平台(如Google Scholar、Researc…

2026/8/26 19:20:15 阅读更多 →
新能源车辆车型大全API:从品牌列表到车型配置

新能源车辆车型大全API:从品牌列表到车型配置

一、车型数据的层级结构汽车数据天然是一个树状结构:品牌(Brand) └── 车系(Series) └── 具体车型(Model) └── 配置详情(Spec)车型库接口通常按照这个层级结构设…

2026/8/26 19:19:14 阅读更多 →
DMHS_VERI数据比对工具

DMHS_VERI数据比对工具

DMHS_VERI数据比对工具 一、概述 DMVERI主要实现功能在进行数据库数据的实时同步的时候,需要了解同步的结果是否 正确,因此需要有数据对比工具进行数据的对比,并生成详细的对比报告,提供用户参考。 达梦数据比对工具VERI产品随同“…

2026/8/26 19:19:14 阅读更多 →
骏成科技(301106)深度研究报告

骏成科技(301106)深度研究报告

一、投资要点 1.1 核心结论 骏成科技(301106.SZ)是国内中小尺寸液晶显示领域的专业制造商,深耕定制化液晶显示器件及显示模组,产品广泛应用于车载电子、工业控制、智能家居、医疗设备等专业显示领域。公司凭借多年积累的定制化研…

2026/8/26 19:19:14 阅读更多 →
江河集团(601886)深度研究报告

江河集团(601886)深度研究报告

一、投资要点1.1 核心结论江河集团(601886.SH)是国内建筑装饰行业的龙头企业,主营业务涵盖建筑幕墙、室内装饰以及光伏建筑一体化(BIPV)三大板块。公司以高端幕墙工程为核心,长期服务于大型公共建筑与商业地…

2026/8/26 19:19:14 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要: 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数(random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录: 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中,主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段,转入了政务服务的常态化落地应用;在实际使用过程中,它能自主理解办事需求、辅助完成填报申报、开展材料预审,并联动多个系统协同作业,真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/26 14:45:33 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/26 17:46:43 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/26 14:46:37 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/26 17:46:39 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →