二分查找
🕧 二分查找
根据灵神的二分查找
题单
以及
视频教程
总结的二分查找模版,主要针对闭区间,左闭右开区间,开区间三种形式去找大于等于target
的元素位置做了总结,并针对>,>=,<,<=
四种关系做了转换,核心点在于找到循环不变量,可以理解为找到target
,之后确定上下界就可以完美利用二分模版解决问题
模版
二分查找的模板适合用在查找与某一个给定元素存在一定关系的元素位置,并且给定的元素是有序的,或者元素排序不影响结果,此时可以考虑用二分查找,核心点需要确定循环不变量以及上下界,当某一个边界无法确定时,可以使用开区间,都可以确定时,使用闭区间
闭区间(推荐)
- 初始化:
left
和right
需要初始化为0
和len-1
- 循环条件:区间内没有元素的情况是
left>right
,所以循环条件为left<=right
- 结果位置:结束循环时,
left
和right
的位置为:[right,left]
,所以结果位置为left
或者right+1
模板如下:
|
|
左闭右开区间
- 初始化:
left
和right
需要初始化为0
和len
- 循环条件:区间内没有元素的情况是
left=right
,所以循环条件为left<right
- 结果位置:结束循环时,
left
和right
的位置为left+1=right
,所以二者都可以当成结果 - 结果位置:结束循环时,
left
和right
的位置为:left=right
,所以结果位置为left
或者right
都可以
模板如下:
|
|
左开右闭区间同理,只需要改变left的更新方式即可
开区间
- 初始化:
left
和right
需要初始化为-1
和len
- 循环条件:区间内没有元素的情况是
left+1=right
,所以循环条件为left+1<right
- 结果位置:结束循环时,left和right的位置为left=right,所以
right
可以当成结果
模板如下:
|
|
关系转换
上面的模板求的是大于等于target的第一个元素出现的位置,剩下的三种情况我们可以将其转换到大于等于上面:
大于:转换成大于等于
target+1
比如大于8,此时可以转换成大于等于9
小于:转换成大于等于
target
的结果-1
比如小于8,此时可以转换成大于等于8的结果位置-1
小于等于:转换成大于等于
target+1
的结果-1
比如小于等于8,此时可以转换成大于等于9的结果位置-1