题目
思路
数据范围,一眼二分。二分范围的更新函数中仍需要一个二分来求结果,所以总的时间复杂度是 O ( n 2 ) O(n^2) O(n2)。还有一些细节写在注释里了。
代码
class Solution {
static bool check(int m, vector<int>& piles, int h) {
vector<int>::iterator it = lower_bound(piles.begin(), piles.end(), m);
int th = (it-piles.begin()); // 小于m的部分都一次可以吃完
for(auto iit = it; iit != piles.end(); iit++) {
th += ceil(1.0*(*iit)/(m*1.0)); // 需要向上取整
}
return h >= th;
}
public:
int minEatingSpeed(vector<int>& piles, int h) {
sort(piles.begin(), piles.end()); // 必须是有序的序列才可以二分哦
int r = piles[piles.size()-1], l = 1;
int m;
int last;
while(l <= r) {
m = l+(r-l)/2;
if(this->check(m, piles, h)) {
last = m;
r = m-1;
} else {
l = m+1;
}
}
return last;
}
};