前言:
适合刚学习二分法,快速入门刷题使用。
在刚学习二分法时,对于>,<,>=,<=,如何判断范围和边界很纠结,从leetcode题解中发现了此方法:力扣,打开了二分法的大门,使自己能之后去理解二分法的思想。
正文:
主体思路:left指针掌管左边蓝色区域,right指针掌管红色区域,两者互不冲突,通过不断向目标区域靠近,扩大两个指针的掌管区域,直到两者掌管的区域接壤,即left+1 != right 。
具体思路:
1、开始时,left和right指针指向探索的区域之外,即left指向探索区域的首元素下标-1,right指向探索区域的尾元素+1
2、循环条件为left+1!=righ,当left+1==right时,跳出循环,此时蓝红区域划分完毕,区域均已着色
3、mid值始终为(left+right)//2
4、left和right指针变化时,直接变成mid,无需+1或-1
伪代码:
left, right = -1, len(nums)
while (left+1!=right):
mid = (left+right)//2
if isBlue(mid):
left = mid
else:
right = mid
return left or right
注:
当要求大于,大于等于,小于,小于等于目标值,可参考下面的图:
- 求第一个大于等于目标值的元素:
left, right = -1, len(nums)
while (left+1!=right):
mid = (left+right)>>2
if nums[mid]<target:
left = mid
else:
right = mid
return right
大于,小于,小于等于参考以上
leetcode中二分法题目:
题号 | 标题 | 难度 |
0034 | 在排序数组中查找元素的第一个和最后一个位置 | 中等 |
0167 | 两数之和 II - 输入有序数组 | 中等 |
0153 | 寻找旋转排序数组中的最小值 | 中等 |