875、爱吃香蕉的珂珂
题目:
解答:
h为k的单调不增加函数,因此可以通过查找k的位置来获得k。k的范围应当是[1,max(piles[i])]
使用二分查找来确定位置,这里的时间复杂度是log(max(piles[i])),后续写成logm,m记为最大值
判断条件:吃的时间h小于k。h的计算需要通过遍历piles数组计算。每个piles[i],吃的时间应该是(piles[i]-1)/k。累加判断是否超过即可,注意溢出。判断其是否超过h,套二分的模板即可。
class Solution {
public:int minEatingSpeed(vector<int>& piles, int h) {int n = piles.size();int left = 1, right = *max_element(piles.begin(), piles.end());if (n == h)return right;int mid = right + (left - right) / 2;while (left <= right) {long ans = 0;for (int i = 0; i < n; i++) {ans += (piles[i] - 1) / mid + 1;}if (ans > h) {left = mid + 1;} else {right = mid - 1;}mid = left + (right - mid) / 2;}return left;}
};
时间复杂度O(nlogm)
空间复杂度O(1)