875.爱吃香蕉的珂珂
https://leetcode-cn.com/problems/koko-eating-bananas
题目描述
方法 1:二分法
思路
题目要求我们找到珂珂在规定时间内吃完香蕉的最小速度 K。那我们要如何确定 K 的范围呢?
显然,珂珂吃香蕉的速度最小应该是 1,而最快则是最大堆香蕉的数量,再快也没有意义了,即 K 的取值范围是 [1, maxPile]。
那接下来,符合直觉的做法是,在这个范围内,从 1 开始逐一尝试,看 K 取哪个值的时候珂珂正好能在规定时间内吃完香蕉。这样线性查找的时间复杂度是 $O(N)$,N 等于 maxPile。
不过,因为 1 ~ maxPile 是连续递增的,要在一个有序的范围内查找一个值的话,很容易就想到了二分查找。
在范围 [1, maxPile] 中使用二分查找寻找最小速度 K;
如果当前速度不够珂珂吃完香蕉,左指针右移,继续寻找;
如果当前速度足够珂珂吃完香蕉,记录当前速度,然后右指针左移,继续寻找是否存在满足条件的更小速度;
复杂度分析
时间复杂度:$O(mlogN)$,N 是最大堆香蕉的数量,m 是香蕉的堆数。二分查找的时间复杂度是 $O(logN)$,检查当前 K 值是否符合要求时遍历 piles 数组的时间复杂度是 $O(m)$。
空间复杂度:$O(1)$。
代码
JavaScript Code
Last updated
Was this helpful?