Ruby:二分查找 LeetCode 875. 爱吃香蕉的珂珂

Ruby:二分查找 LeetCode 875. 爱吃香蕉的珂珂_第1张图片

  1. 爱吃香蕉的珂珂

珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。
珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。

示例 1:
输入:piles = [3,6,7,11], h = 8
输出:4

示例 2:
输入:piles = [30,11,23,4,20], h = 5
输出:30

示例 3:
输入:piles = [30,11,23,4,20], h = 6
输出:23

提示:
1 <= piles.length <= 104
piles.length <= h <= 109
1 <= piles[i] <= 109

# @param {Integer[]} piles
# @param {Integer} h
# @return {Integer}
def min_eating_speed(piles, h)
    #n = piles.size
    #return piles[n - 1] if n == h

    # 没有公式?暴力试?
    # min_k = piles.sum / h

    # while true
    #     need_h = 0
    #     for pile in piles 
    #         need_h += (pile/min_k)
    #         need_h += 1 if (pile % min_k) != 0 
    #     end
    #     return min_k if need_h == h
    #     min_k += 1
    # end

    # 上面的代码会超时,改为二分查找
    piles_sum = piles.sum
    return 1 if piles_sum < h

    min_k = piles_sum / h
    max_k = piles.max
    
    while true
        return max_k if max_k == min_k
        mid_k = max_k/2 + min_k/2
        need_h = 0
        for pile in piles 
            need_h += (pile/mid_k)
            need_h += 1 if (pile % mid_k) != 0 
        end
        if need_h > h
            min_k = mid_k + 1
        else
            max_k = mid_k
        end
    end
    
end

你可能感兴趣的:(Ruby,试题,ruby,leetcode,算法,数据结构)