刷题
刷题
learn
learn
日期
Aug 28, 2024
二分搜索:
- 在有序数组中确定num存在还是不存在
- 在有序数组种找≥num的最左位置,思路:
ans
先初始化为-1;- 然后开始二分,如果
mid
对应的元素 ≥ num,更新ans
= mid,然后继续在左边二分;如果mid
对应的元素 < num,不动ans
,在右边继续二分
- 在有序数组种找≤num的最右位置
- 二分搜索不一定发生在有序数组上(比如寻找峰值问题,LeetCode第162题) 思路:类比函数的中值定理!
- “二分答案法”是非常重要的算法
如果数组长度为n,那么二分搜索搜索次数是次,以2为底
二分搜索时间复杂度是
一个细节:
二分查找中,会用到:
mid = (right + left) / 2
,但是有一种更安全的写法:
更安全的原因:对于int类型,可以存储的最大值约为21亿左右;而如果
left
和 right
都很大,比如 left
是15亿, right
是16亿的时候,用普通的写法其和会溢出;而用上面这种就不会- 先看0位置的是不是峰值:
- 是:返回
- 不是:继续
- 再看N-1位置的是不是峰值:
- 是:返回
- 不是:继续
- 令
l = 1
,r = N-2
,mid = l + (r-l) >> 1
, - 如果
mid
是峰值:返回; - 如果
mid
不是峰值: - 如果
mid
比左边小,在左边二分; - 否则在右边二分