2023年3月9日 星期四

875. Koko Eating Bananas

解題思路

直覺想到這題是在解等式,假設答案為 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;
    }
};

沒有留言:

張貼留言