算法-二分查找
目录
警告
本文最后更新于 2022-08-29,文中内容可能已过时。
1.基础
- 要求序列非递减,即
nums[i - 1] <= nums[i]
- 时间复杂度:$O(\log n)$
2.等于指定值
- 返回值:
返回数组中等于指定值的元素的下标。
- 测试结果:
|
|
- 闭区间写法:
|
|
- 左闭右开写法:
|
|
3.第一个大于指定值
- 返回值:
返回数组中大于指定值的最小元素的下标。
- 测试结果:
|
|
- 闭区间写法:
|
|
- 左闭右开写法:
|
|
4.第一个大于等于指定值
- 返回值:
返回数组中大于等于指定值的最小元素的下标。
- 测试结果:
|
|
- 闭区间写法:
|
|
- 左闭右开写法:
|
|
5.最后一个小于指定值
- 返回值:
返回数组中小于指定值的最大元素的下标。
- 测试结果:
|
|
- 闭区间写法:
|
|
- 左闭右开写法:
|
|
6.最后一个小于等于指定值
- 返回值:
返回数组中小于等于指定值的最大元素的下标。
- 测试结果:
|
|
- 闭区间写法:
|
|
- 左闭右开写法:
|
|
7.总结
- 闭区间 vs 左闭右开:
|
|
- 大于等于 vs 小于等于 vs 大于 vs 小于:
|
|
8.实战
二分查找
|
|
第一个错误的版本
|
|
搜索插入位置
|
|
🟥阶乘函数后 K 个零
- 一个数字末尾 0 的数量就是其因子中 10 的数量,也就是 2 的数量和 5 的数量的更小值。
- x! 的因子中 5 的数量一定少于 2 的数量,所以 x! 的末尾有 k 个 0 即因子中 5 的数量为 k。
- 形如 f * 5 的数,每个数字在阶乘中贡献 1 个 5。
- 形如 f * 25 的数,每个数字在阶乘中额外贡献 1 个 5,共贡献了 2 个 5。
- 形如 f * 125 的数,每个数字在阶乘中额外贡献 1 个 5,共贡献了 3 个 5。
- …
- 总结,形如 f * 5 ^ p 的数,每个数字在阶乘中共贡献了 p 个 5。
- 数 f * 5、f * 5 + 1、f * 5 + 2、f * 5 + 3、f * 5 + 4 中因子 5 的数量不变,所以若 k 合法,则返回 5,若 k 不合法,则返回 0。
|
|