解題思路
直覺想到這題是在解等式,假設答案為 x,那該等式為 ceil(piles[i]/i) 的 sum 要小於等於 h,找出最小的 x。
只是要怎麼求 x?很酷的方法是想成 x 的所有可能範圍值介在 1 ~ max(piles),然後用 binary search 的方式縮小範圍。如果 mid 是可以的,那就再往左邊試看看更小的還有無機會(right shift);如果不行代表 left 要往右移一點。
程式碼
class Solution {
public:
int minEatingSpeed(vector<int>& piles, int h) {
int maxPile = 0;
for(int i=0; i<piles.size(); i++)
maxPile = max(maxPile, piles[i]);
int left = 1, right = maxPile, mid;
while(left <= right)
{
mid = (left + right) / 2;
long long int hour = 0;
for(int i=0; i<piles.size(); i++)
hour += ceil((double)piles[i] / mid);
if(hour > h)
left = mid + 1;
else
right = mid - 1;
}
return left;
}
};
沒有留言:
張貼留言