二分查找
面试官问:"在有序数组[1,3,5,7,9,11,13]中查找7,写一下代码。"
候选人小张刷刷刷写完了:
面试官看了一眼,问:"这个代码会死循环,你知道吗?"
小张愣住了...
一、从一个问题开始
二分查找是面试中出现频率最高的算法之一,90%的候选人能写出基本版本,但能正确处理边界条件的不超过60%,能熟练运用各种变体的不超过30%。
今天,我们把二分查找彻底讲透。
【直观类比】
二分查找就像猜数字游戏:
- 答案在1-100之间
- 你猜50,告诉你大了
- 你猜25,告诉你小了
- 你猜37,告诉你对了
每次猜完都排除一半的答案,这就是为什么二分查找只需要log₂(n)次就能找到目标。
二、基础二分查找
2.1 标准模板
2.2 四个关键边界问题
面试官问的问题就出在这里。让我们一一分析:
2.3 查找过程演示
三、二分查找的变体
3.1 查找左边界
找到第一个等于目标值的位置。
3.2 查找右边界
找到最后一个等于目标值的位置。
3.3 左边界 vs 右边界对比
四、旋转数组的二分查找
4.1 题目
假设一个排序数组在某个位置被旋转,例如[4,5,6,7,0,1,2]。
4.2 解法
五、二分的本质
5.1 二分查找的适用范围
二分查找不只适用于排序数组,适用于任何满足单调性的问题:
5.2 二分答案
很多优化问题可以转化为二分查找:
六、面试高频追问
6.1 追问一:为什么 mid = (left + right) / 2 可能溢出?
6.2 追问二:二分查找一定比线性查找快吗?
不一定!
6.3 追问三:如何在链表上实现二分查找?
七、常见误区
❌ 误区一:二分查找只能用于排序数组
实际情况:二分查找适用于任何具有单调性的问题,可以把问题转化为"答案是否可行"。
❌ 误区二:mid 的计算不重要
实际情况:mid 的计算错误可能导致死循环或漏掉元素。
❌ 误区三:二分查找一定比线性查找快
实际情况:对于小数据量,线性查找可能更快。
八、记忆技巧
用口诀记住边界条件:
左闭右开,左边+1;左开右闭,右边-1
用口诀记住变体:
找左边界,right左移;找右边界,left右移
九、实战检验
检验一:力扣704题 - 二分查找
检验二:力扣34题 - 在排序数组中查找元素的第一个和最后一个位置
检验三:力扣33题 - 搜索旋转排序数组
十、总结
二分查找的核心是每次排除一半:
- 确定搜索范围:左闭右闭区间
[left, right] - 计算中点:防溢出的
mid = left + (right - left) / 2 - 判断并缩小范围:根据
arr[mid]与target的关系 - 处理变体:左边界、右边界需要特殊处理
记住这三句话:
- 二分查找的本质是排除法,不是在数组里找,是在答案空间里找
- 边界条件是二分查找的核心,写错就死循环
- 二分查找不只适用于排序数组,适用于任何具有单调性的问题
下一篇文章,我们来聊聊LRU缓存,看看如何设计一个高效的缓存淘汰机制。