二分查找通用模板
这两天在学习二分查找,一开始天真地以为非常简单,只要找到一个数后直接返回即可。后来去刷题时发现二分查找还有很多种情况要去处理,比如说在一个有序数组中查找第一个大于等于某个数的位置或者小于等于某个数的位置等等。此时,就需要细心的判断退出条件以及更换左右节点的情况了,比较麻烦。在看了大量的视频后,学会了一个简单易懂并且通用的模板,特此记录一下。
left和right一开始指向的位置可能和在其他地方看到的初始位置不同,本模板的left和right指向的数都是满足条件isLeft和isRight的。left及左边的值都是满足isLeft,right及右边的值都是满足isRight。如果一开始left指向0,倘若此时数组中全是isRight的值,那么left返回的值就不是我们所需要的了。right同理。
//left和right分别指向第一个数的左侧和最后一个数的右侧
int left = -1, right = N;
//当left和right相邻时,此时已经找到了isLeft和isRight的分界线
while(left+1 != right){
int mid = left + (right-left)/2;
//如果mid满足isLeft,代表mid这个位置是满足左边条件的,就把left设为mid,继续查找
if(isLeft(mid))
mid = left;
//如果mid不满足isLeft,表示mid应该属于右侧,所以把right设为mid。
else
right = mid;
}
//最后根据我们的需要返回对应的值
return left or right;
为什么说这个模板万能呢,因为isLeft(mid)函数可以被我们自己任意去改成我们想要的条件
为什么说这个模板简单呢,因为left和right指向的永远是满足对应的条件的位置,不用去考虑left/right要不要加1的问题