每日算法系列【LeetCode 875】愛吃香蕉的珂珂

題目描述

珂珂喜歡吃香蕉。這裏有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 H 小時後回來。node

珂珂能夠決定她吃香蕉的速度 K (單位:根/小時)。每一個小時,她將會選擇一堆香蕉,從中吃掉 K 根。若是這堆香蕉少於 K 根,她將吃掉這堆的全部香蕉,而後這一小時內不會再吃更多的香蕉。python

珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉全部的香蕉。c++

返回她能夠在 H 小時內吃掉全部香蕉的最小速度 K(K 爲整數)。web

示例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 <= 10^4
  • piles.length <= H <= 10^9
  • 1 <= piles[i] <= 10^9

題解

簡單複述一下題意,就是有 N 堆香蕉,每堆有 piles[i] 個,如今要求一個整數速度 K ,吃一堆香蕉要的時間是 piles[i] / K (不是整數要上取整),問使得吃完全部香蕉所需總時間小於等於 H 的最小速度 K 是多少?svg

顯然 K 越小,吃每堆香蕉所須要的時間就越長,總時間也就越長,那麼天然而然能夠想到二分答案 K 。學習

對於當前的 K ,咱們遍歷數組,算出總時間,若是總時間大於 H ,那就說明 K 過小了,還得提速;若是總時間小於等於 H ,那就說明速度 K 還能夠降一點,總時間可能不變(由於存在上取整),也可能變大。

這樣最終的時間複雜度僅僅只有   ,其中   是數組中的最大值,也就是二分上界。但其實這裏還能夠優化一下二分的上下界,好比上界,最大其實就是數組中的最大元素大小, K 再大也沒有意義了。

代碼

c++

class Solution {public: int minEatingSpeed(vector<int>& piles, int H) { int maxv = *max_element(piles.begin(), piles.end()); int n = piles.size(); int l = 1, r = maxv; while (l < r) { int m = (r - l) / 2 + l; int cnt = 0; for (int i = 0; i < n; ++i) { cnt += (piles[i] + m - 1) / m; } if (cnt > H) l = m + 1; else r = m; } return r; }};

python

class Solution: def minEatingSpeed(self, piles: List[int], H: int) -> int: maxv = max(piles) l = 1 r = maxv while l < r: m = (r - l) // 2 + l cnt = 0 for p in piles: cnt += (p + m - 1) // m if cnt > H: l = m + 1 else: r = m return r

後記

注意上面的代碼仍是有幾個小細節的:

  • 二分終止條件設置的是 l >= r ,因此 l 的更新必須是 l = m + 1 ,由於若是 l = r - 1 的話,m 會等於 l 。
  • 爲了防止整型溢出,計算 l 和 r 均值的時候不要寫 (l + r) / 2 。
  • 上取整簡單寫法就是 (p + m - 1) / m 。

做者簡介:godweiyang知乎同名華東師範大學計算機系碩士在讀,方向天然語言處理與深度學習喜歡與人分享技術與知識,期待與你的進一步交流~


個人微信:weiyang792321264。有任何問題均可以在評論區留言,也歡迎加我微信深刻溝通~



本文分享自微信公衆號 - 算法碼上來(GodNLP)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索