尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
leetcode面试经典150刷题实录:二分查找与二分答案详解
今天是1月25日我保持LeetCode刷题记录的第66天。如果用一句话介绍这篇文章一份围绕“leetcode面试经典150”的刷题实录里面有二分查找和二分答案的完整拆解、两道经典150真题的题解、一场周赛的收获以及66天连续刷题不中断的实操经验。适合正在准备算法面试、或者已经刷了几个月却总觉得“刷一道忘一道”的人读。我不会给你灌鸡汤只记录今天真正做过的事、踩过的坑还有那些值得抄进笔记里的模板。刷题打卡这件事听起来很简单但真正坚持到第66天你会发现关键不是“多努力”而是“多稳定”。今天正好是周末原计划只做两道题收尾二分查找专题结果一坐下来就顺着题单多写了两道晚上还顺手参加了周赛430。于是就有了这篇比较完整的记录标题也跟着我的固定打卡格式走day661.25——leetcode面试经典150。1. 为什么选“面试经典150”作为刷题主线1.1 面试经典150和热门100题怎么选刚开始刷LeetCode的时候我也收藏过一堆所谓“刷题路线图”但最后真正走完一遍的只有官方整理的面试经典150题。原因很简单它按专题组织每个专题的题目数量足够让你形成肌肉记忆。比如二分查找这个板块不是只给一道题而是把搜索旋转排序数组、寻找旋转排序数组中的最小值、爱吃香蕉的珂珂等放在一起。练完整个专题你自然就能总结出一套通用模板而不是“好像见过这道题但换个说法就不会了”。热门100题当然也是好东西每道题都经过大量用户验证属于高频中的高频。但它的排列逻辑更偏向“出现频率”而不是“知识结构”。对于还没有建立完整算法框架的选手来说直接刷热门100题容易陷入“这道题会了下一道题又像新题”的困境。面试经典150恰好弥补了这个短板数组/字符串、双指针、滑动窗口、哈希、区间、栈、链表、二叉树、图、回溯、二分查找、堆、动态规划每个板块都有成体系的题目。跟着这个题单走就像跟着教材学一遍算法而不是被题海淹没。1.2 第66天的实际进度我在哪个专题我的刷题习惯是每两周挑一个周末做专题收尾。今天第66天刚好走在二分查找专题的末尾。上午先用了20分钟重写“搜索旋转排序数组”的模板因为这类题的边界条件实在太容易翻车。下午继续做“爱吃香蕉的珂珂”中间经历了超时和边界判断两个Bug。晚上参加周赛430发现其中一道题的核心思路居然也是二分答案。整体节奏不轻松但非常充实。这里顺带解释一下标题里的“day661.25”是什么意思。我每天打卡都固定用这个格式第几天加日期加刷题主题。比如今天的记录就是“day661.25——leetcode面试经典150”。这样做的好处是以后回看时能清楚知道自己是在什么阶段、什么周期完成的哪些专题。很多人的刷题计划之所以半途而废就是因为没有这种颗粒度足够细的记录。66天下来翻着记录找题和找状态比翻收藏夹里的题解管用得多。2. 今日核心二分查找与二分答案的细节拆解2.1 先分清两个“二分”很多人一听到二分脑子里只有“在有序数组里找一个数”。但面试里更常考的其实是“对答案二分”。这两个概念虽然都叫二分但解决的问题完全不同。经典二分查找是数据结构层面的搜索数组已经有序通过比较中间值和目标值每轮排除一半数据复杂度O(log n)。它处理的是“在一个已知集合里找元素”的问题。二分答案则是优化层面的枚举当问题要求“最小可行值”或者“最大可行值”而这个值的取值区间很大、且可行性与这个值之间存在单调关系时不需要从1开始一个一个试到上限而是直接对值域进行二分每次取中间值调用一个check函数来判断这个中间值是否可行。举个例子。假设你要判断一辆车最少需要跑多快才能在h小时内跑完所有路程。速度上限可能很大线性试速度大概率超时。但速度越快总耗时越短“能不能在h小时内跑完”这件事会随着速度单调变化。所以可以二分速度而不是逐个枚举。这就是二分答案最典型的应用场景。2.2 爱吃香蕉的珂珂一道二分答案的完美入门题LeetCode 875题“爱吃香蕉的珂珂”也就是有人开玩笑叫“爱吃香蕉的狒狒”的那道题是二分答案入门的绝佳素材。题目描述很直白有n堆香蕉第i堆有piles[i]根警卫会在h小时后回来。珂珂每小时可以吃某堆的若干根香蕉。如果她决定一小时吃k根那么她一小时最多吃k根而且不会在同一个小时同时吃好几堆。要求找到能在h小时内吃完所有香蕉的最小k。这道题有三个关键点需要想清楚。第一每堆香蕉必须在一小时内完整处理不能“这堆吃一半下一个小时再回来吃剩下的一半”。因为一小时只能选一堆香蕉来吃。所以对于某一堆数量为p的香蕉吃完它需要的最少小时数是ceil(p/k)。这里不要用循环一次一次减直接用整除公式(p k - 1) // k也就是向上取整。第二总耗时等于所有堆的耗时相加也就是sum(ceil(piles[i]/k))。如果这个总耗时小于等于h说明当前速度k可行但可能还能更慢所以要把搜索区间向左收缩如果总耗时大于h说明k太小了必须更快所以要把搜索区间向右移动。第三k的取值下界是1上界是max(piles)。因为一旦k大于等于最大堆的数量任何一堆都能在一小时内解决再大的k没有任何意义。check函数写出来是这样def can_finish(k): total 0 for p in piles: total (p k - 1) // k if total h: return False return True然后对k做二分。我习惯用左闭右开区间模板def minEatingSpeed(piles, h): left 1 right max(piles) 1 while left right: mid (left right) // 2 if can_finish(mid): right mid else: left mid 1 return left为什么right要设置成max(piles) 1因为左闭右开区间[left, right)里right本身是不被包含的。而答案最大可能恰好就是max(piles)。如果right直接取max(piles)当答案等于max(piles)时left会一路逼近到max(piles)但因为区间是左闭右开循环终止条件left right可能出现问题。为了确保所有可能答案都落在[left, right)内right必须比最大可能值再大一位。这是一个很典型的小坑记不住的话容易在笔试时翻车。2.3 怎么识别“这道题该用二分答案”刷题多了以后看到一道新题第一反应不应该是“这题有没有见过”而应该是“这题能不能二分”。这里分享三个识别特征。特征一题目里出现“最小速度”、“最大重量”、“至少几天”、“至多几条”这类描述并且存在一个可以调整的数值变量X比如速度、距离、容量、天数。这个X就是我们要二分的对象。特征二随着X增大题目给出的某个指标呈单调变化。通常来说速度越大耗时越短容量越大需要的容器越少时间越长能完成的任务越多。这种单调性正是二分的前提。特征三X的取值范围很大可能是1e9甚至更大根本不可能线性枚举。但是check函数本身却可以O(n)甚至O(logn)地快速判断。一旦满足这三点别纠结贪心先问自己“如果把这个X当作答案能不能写一个check函数”今天的“爱吃香蕉的珂珂”就是标准的特征三速度上限max(piles)数组长度可能达到10^4如果从1到max(piles)逐个试遇到大量数据直接超时。二分后时间复杂度降为O(n log max(piles))稳得很。3. 实操记录day66的三道题题解与踩坑3.1 搜索旋转排序数组等号决定生死LeetCode 33题“搜索旋转排序数组”是面试经典150里的老熟人。题目给一个升序排列的数组在某个未知位置旋转比如[0,1,2,4,5,6,7]可能变成[4,5,6,7,0,1,2]。要求用O(logn)的时间找到目标值下标找不到返回-1。这道题的核心思想是每次取mid后mid的左右两侧中至少有一侧是严格有序的。我们只需要判断target到底落在哪一侧然后缩小区间就行。判断方法很简单def search(nums, target): left, right 0, len(nums) - 1 while left right: mid (left right) // 2 if nums[mid] target: return mid if nums[left] nums[mid]: # 左半边有序 if nums[left] target nums[mid]: right mid - 1 else: left mid 1 else: # 右半边有序 if nums[mid] target nums[right]: left mid 1 else: right mid - 1 return -1这里我要特别强调一个等号问题。很多初次写这道题的人会把第一行分支写成nums[left] nums[mid]而不是。在数组只有两个元素时比如[3,1]left0mid0left和mid指向同一个位置这种情况下单个元素本身是有序的应该进入“左半边有序”的分支。如果漏掉等号程序会错误地认为左半无序从而进入右半有序分支导致某些情况判断错误。这个等号不是洁癖是安全问题。我今天重写这道题时故意先不看题解凭记忆写了一遍。结果第一版就漏了等号在测试用例[5,1,3]里找3的时候直接返回了-1。这个问题很隐蔽因为大部分测试数据不会让你第一轮就遇到left mid但一旦遇到基本都是非错不可。如果你也想彻底搞懂建议把旋转数组的两个经典边界情况手动走一遍长度2且完全反转长度3且旋转点在中间。3.2 爱吃香蕉的珂珂从超时到AC的完整过程这道题我今天做了不止一遍。第一次自己写的时候居然先写了个线性枚举版本从速度1开始一个一个试看看哪个速度能完成。数据小还好一旦piles元素多、max(piles)大立刻TLE。提交后看到超时我才反应过来这不就是典型的二分答案模板题吗66天刷题带来的直觉就在于看到“最小速度”加“给定时间限制”马上就该想到二分而不是穷举。第二次写我吸取教训把check函数提取出来不过又踩了第二个坑。计算总时间时我习惯性地写了这样一段while pile 0: pile - k hours 1看起来没问题但piles[i]最大可能有10^9k最小是1单堆就要循环10^9次必然超时。必须改成数学计算(pile k - 1) // k一次除法直接得到完整小时数。这里最大的教训是不要用循环模拟除法除非k的范围也很小。第三次写终于AC。完整代码放在上面2.2节里这里就不再重复。我想多说一句关于题目保证条件的细节。本题保证h len(piles)因为每小时最多只能吃一堆如果h小于堆数无论如何都吃不完。所以代码里不需要额外特判。但如果你在笔试中遇到类似题最好在开头加一行if h len(piles): return -1防止题目偷偷改条件。3.3 周赛430专项练习之外的另一面晚上我抽空参加了周赛430。很多人觉得周赛是高手证明自己用的但我觉得它更像一个“题型识别压力测试”。平时刷题可以慢慢想周赛却逼着你快速判断这道题考什么有没有现成模板可以套边界条件是什么。周赛430中有一道题核心思路很接近二分答案。题目背景我记不清了但当时我看到那个“最大...使得...”的问题结构立刻联想到今天下午写的珂珂吃香蕉。检查函数没花多久就写好了。比赛结束后我把这道题也整理进了错题本但没有计入经典150的打卡记录因为它不在题单上。这里也提醒一点周赛的罚时机制很严格边界条件宁可多写几个测试用例再提交也不要抢那几十秒。我今天因为少考虑一个数据范围白白吃了一发罚时排名掉了一截。这个教训在面试里同样适用面试官不看你AC多快而看你思路是否严密。4. 66天坚持刷题的经验与状态管理4.1 我是怎么保持66天不断更的很多朋友问过我怎么坚持这么久。说实话坚持不靠热血靠的是机制。第一我的最低限度是每天至少一道题简单题也算数。状态好的时候多刷几道状态差的时候就挑一道Easy题快速收工。这样心理压力非常小也不可能给自己找“今天太累了不刷了”的借口。第二打卡格式固定每次都记录“dayN日期——主题”。day661.25这个标题看起来简单但它是非常强的正向反馈。每天在笔记上写下这个编号你会看到自己在一点点推进。这种“看得见的进度”比收藏夹里的一百篇题解更能让人坚持。第三碎片时间做轻量工作。通勤时我看题解和评论区思考某道题为什么这样解但不写代码。真正写代码固定安排在晚上15到30分钟足够完成一道题。把“输入”和“输出”分开效率会高很多。4.2 卡题和遗忘的应对方法卡题是常事。我给自己定了个规则一道题卡超过45分钟直接看题解。这不是偷懒而是避免无效的时间黑洞。看题解之后我会合上题解自己重新把代码写一遍。能写出来这道题才算过写不出来那就标记“待复习”第二天再写。遗忘同样正常。算法不是靠背题而是靠理解题型和模板。但理解会褪色所以我的应对办法是每周末做一次主题复习把这个星期做过的题重新看一遍重点重写那些当时“看题解才写出来”的题目。重写时如果能流畅AC说明真的吸收了如果还是卡住就打上标记下周再复习一次。心态上最忌讳的就是和别人比数量。我认识有人一周刷50题但问他某类题的通用解法只能答“多刷就好了”。而我的笔记里每一题都有核心思路、复杂度和踩坑记录。66天下来通过经典150题沉淀出来的是题型模板而不是零散题解。这个差别在面试时才真正体现出来。5. 常见问题速查新手刷经典150最容易踩的坑5.1 只刷题不总结等于白刷刷题最容易掉进的坑是看到AC就激动地翻下一题从不停下来总结。过一周再看题目倒是眼熟但就是不会写。这里的解药很简单每道题固定写三行笔记分别是核心思路、复杂度、踩坑点。今天“爱吃香蕉的珂珂”的三行笔记我直接抄在下面你可以参考这个格式核心思路对速度k做二分答案check函数计算总耗时总耗时h则右边界缩小否则左边界右移。复杂度O(n log max(piles))。踩坑点单堆香蕉不能跨小时吃用(p k - 1)//k算时间右边界要取max(piles)1。这种笔记不用长三行就够。关键是写出来写的过程会强迫你提炼而提炼就是理解。5.2 死磕Hard题和追求完美另一个极端是上来就死磕Hard题。AC不了就怀疑人生最后连刷题的勇气都没了。我的建议很直接如果你还在刷经典150的第一遍不要把Hard题当主食。Medium题才是面试主力Hard题更多是锦上添花。与其在Hard上耗两小时不如把二分查找的几种变体贴身过一遍。还有一点心态问题刷题不是考试不需要“裸奔”。你完全可以先看题解再合上自己写。面试时也可以和面试官讨论思路。刷题阶段的核心目标是内化套路不是证明自己不看答案也能做。把这个想通了很多焦虑都会消失。5.3 经典错误排查表我把刷二分题最常见的错误整理成一张速查表今天就用得上的那种。错误现象可能原因解决办法代码TLE用线性枚举代替二分答案寻找单调变量改造成check二分答案总是差1check函数分支写反或者返回left/right混淆用一个最小用例手动走一遍比如[3,1]找1循环死循环二分更新区间时左右边界没有变化固定使用左闭右开模板并确保每次更新都缩小范围数组越界初始边界设置错误检查left和right的初始值以及访问元素的索引是否越界这张表不止适用于今天的三道题对大部分二分题目都通用。我建议你把它存下来遇到类似报错时先对号入座。最后再分享一个小技巧。现在无论我用哪种语言写二分都会把左闭右开模板先放在IDE的代码片段里包括mid计算防溢出、check函数留空。每次遇到新题先套模板改check而不是从零推导边界。这个习惯帮我节省了大量时间也让我把精力真正放在题目本身的逻辑上。如果你也在刷LeetCode不妨试试今天这个节奏一道二分查找、一道二分答案、一场周赛然后睡前写三行笔记。坚持到第66天你会看到自己的变化。
RELATED

相关推荐

Transformer架构魔改实战:从注意力机制到稀疏化与MoE

Transformer架构魔改实战:从注意力机制到稀疏化与MoE

入行到现在,我拆过的网络结构两只手加两只脚都数不过来。早几年我天天跟卷积网络较劲,后来又掉进序列模型的坑里跟LSTM缠斗,再往后几乎每个项目都会落到同一个名字上——transformer。说句实话,我对它是又爱又恨:爱的是…

📅 2026/10/10 7:24:31
从“11666666”看重复数字输入背后的数据质量与安全设计

从“11666666”看重复数字输入背后的数据质量与安全设计

你有没有遇到过这种情况:一个用户随手在输入框里敲了一串数字,按下回车,留下一个看起来毫无意义的值——“11666666”。它不像手机号,不像身份证号,不像订单号,也看不出属于任何编码规则,但偏偏…

📅 2026/10/10 7:24:31
Windows内核性能监控:PCW计数器集实战指南

Windows内核性能监控:PCW计数器集实战指南

1. 这不是“Hello World”,而是内核级性能监控的实操入口如果你在Windows驱动开发圈里混过几年,大概率见过Kcs这个缩写——它不是某个网红缩写,也不是新出的编程范式,而是Kernel Counter Set(内核计数器集)…

📅 2026/10/10 7:24:31
MORE NEWS

更多资讯

📰

PJ85718DM+MKV42F128VLH16工业温控信号链设计

1. 项目概述:为什么两个看似不相关的芯片组合,成了温控系统的“黄金搭档”你有没有遇到过这样的场景:在调试一台新部署的HVAC(暖通空调)控制面板时,本地温度传感器读数稳定,但远程监控平台却频繁…

📰

Muse与Dots竞逐消费级AI agent;700篇AI证明引发数学家抵制 | 科技日报1009

700篇AI证明引发数学家抵制 #1人类数学协会(AHM)呼吁数学家停止与OpenAI合作。该协会认为,在 OpenAI 一次性发布数百篇 AI 生成的数学手稿后,公司违反了科学研究的基本规范。协会主席、菲尔兹奖得主陶哲轩以客座文章形式在自己的博…

📰

OpenHarmony实战:MAX30100血氧心率传感器驱动开发从零到通

这几年可穿戴设备火起来之后,血氧心跳传感器MAX30100成了很多人入门嵌入式开发的第一个目标芯片;而要在OpenHarmony系统上把这颗芯片的驱动开发做通,绕不开I2C协议、PPG采集和底层算法几个硬骨头。手头正好有一块基于OpenHarmony的开发板&…

📰

CMake 策略 CMP0107 详解:禁止 ALIAS 目标覆盖同名已有目标

构建工具开发工具CLI 【免费下载链接】CMake Mirror of CMake upstream repository 项目地址: https://gitcode.com/gh_mirrors/cm/CMake 点击查看 免费下载 导读 CMP0107 是 CMake 3.18 引入的一项兼容性策略,核心内容是:不允许创建一个与…

📰

用 __android_log_print(ANDROID_LOG_DEBUG, 打印出data_ptr[i]的值

在Android NDK开发中&#xff0c;__android_log_print 函数用于将日志信息输出到Logcat。如果你想打印出指针 data_ptr 指向的数组中第 i 个元素的值&#xff0c;你可以使用以下代码&#xff1a;cpp #include <android/log.h>// 假设 data_ptr 是一个指向 unsigned char …

📰

Flink电商实时计算实战:从Kafka到五大核心指标

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬