875. 爱吃香蕉的珂珂
分析
- 定义区间:
- 吃香蕉速度的下界
l
为1
(最低速度) - 吃香蕉速度的上界
r
为10^9
(最大速度,假设所有香蕉都在一堆中且时间充足)
- 吃香蕉速度的下界
- 判断函数
getTime(piles, k)
:- 计算以速度
k
吃完所有香蕉需要的时间 - 遍历每堆香蕉
pile
,需要的时间为pile / k
上取整,可以通过(pile + k - 1) / k
实现
- 计算以速度
- 二分查找:
- 计算中间值
mid = (l + r) / 2
:- 如果
getTime(piles, mid) <= h
,说明速度mid
可以满足要求,但可能还有更小的速度满足条件,因此缩小上界r = mid
- 如果
getTime(piles, mid)} > h
,说明速度mid
不够快,需要增大速度,更新下界l = mid + 1
- 如果
- 计算中间值
- 结束条件:
- 当
l == r
时,搜索范围缩小到单一值,返回l
或r
即为最小速度
- 当
时间复杂度
- 二分查找最多进行
O(log(10^9))
次 - 每次计算
getTime(piles, k)
需要O(n)
,其中n
是香蕉堆的数量
总复杂度为 O(n * log(10^9))
空间复杂度
空间复杂度为 O(1)
C++代码
|
|