引言
力扣大概做了四百来道,但最近发现遇到二分的题目总是不敏感,而且做二分的思路不清晰,有时需要Debug来处理边界越界问题,这在面试手撕时非常不友好。于是乎想来总结下二分模版,希望日后遇到二分统统秒杀!
二分问题特点
总的来说,二分查找特点就是在有序区间内查找符合特定要求的元素,大体可以分三类:
- 查找与特定值等值的元素下标;
- 查找第一个大于等于特定值的元素下标;
- 查找最后一个小于等于特定值的元素下标;
- ......
从本质上看,二分问题思路十分简单,即在一个循环内不断地比较区域中间值与目标值的大小,根据区间的有序性,每次排除一半的候选元素。但二分问题的难度在于细节的处理上,这些细节包括边界处理、适应具体题目要求的变化等。个人觉得,这些细节包括:
- 左边界
left
、右边界right
的初始值取 0 到 n - 1,还是 0 到 n ? - 循环的判定条件是
left < right
还是left <= right
? - 具体的
if 条件该如何写?if 条件为真时,该更新 left 还是 right ?
更新 left、right 时,mid 是否需要
±1 ?- ......
通过阅读与学习相关博客,本文将从找“下界”问题(即查找第一个大于等于特定值的元素下标)出发,总结二分查找的所有模版。