↓快轉到主要內容
  1. LeetCode/

LeetCode 875: Koko Eating Bananas

·1 分鐘· ·
LeetCode Medium Array Binary-Search
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-28

  • 提交紀錄:Wrong Answer ×9 → Runtime Error → Wrong Answer ×3 → Accepted ×2 → Wrong Answer → Accepted ×3

解題思路
#

速度越快、花的時數越少,有單調性,對答案二分(Binary Search 模板二)。找最小的 k 讓 sum(ceil(p / k)) <= h:

  • 時數 <= h:k 可行,但可能還有更小的,r = mid。
  • 時數 > h:太慢,l = mid + 1。

速度範圍是 [1, max(piles)]。

我的嘗試
#

這題提交了 19 次,問題都在二分的方向和停止條件:

  • 時數剛好等於 h 就直接回傳,但可能還有更小的速度也行。例如 [4]、h = 5:速度 1 就夠,回傳了 4。
  • 改了幾次之後方向反了:寫成 times < h 時往左、其他(包括相等)往右,相等時把可行的答案丟掉了。例如 [7]、h = 2:答案 4,回傳 7。

正確解法
#

class Solution:
    def minEatingSpeed(self, piles: List[int], h: int) -> int:
        l, r = 1, max(piles)
        while l < r:
            mid = (l + r) // 2
            hours = sum((p + mid - 1) // mid for p in piles)
            if hours <= h:
                r = mid
            else:
                l = mid + 1
        return l

複雜度
#

時間 O(n log M),M 是最大的一堆,空間 O(1)。

要特別避免的錯誤
#

  • 時數剛好等於 h 不代表是最小的速度,還要往左找。
  • 向上取整用整數 (p + k - 1) // k。

面試口說整理
#

速度越快時數越少,所以我對速度二分:時數不超過 h 就往左找更小的速度,超過就往右。範圍是 1 到最大的一堆。時間 O(n log M)。

相關文章

LeetCode 153: Find Minimum in Rotated Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 153 解題筆記:拿 mid 跟右端比:nums[mid] > nums[r] 代表最小值在右邊,否則 mid 可能就是最小值,r = mid
LeetCode 167: Two Sum II - Input Array Is Sorted
·1 分鐘
LeetCode Medium Array Two-Pointers Binary-Search
LeetCode 167 解題筆記:已排序,左右指針往中間走:和太大右指針左移,太小左指針右移;回傳的 index 從 1 開始
LeetCode 81: Search in Rotated Sorted Array II
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 81 解題筆記:有重複值時 nums[l] == nums[mid] 會分不出哪一半有序,這時只能把 l 往右移一格;最壞 O(n)
LeetCode 74: Search a 2D Matrix
·1 分鐘
LeetCode Medium Array Binary-Search Matrix
LeetCode 74 解題筆記:每列接上一列是完整排序的,把矩陣當成長度 m × n 的一維陣列二分,mid 換成 (mid // n, mid % n)
LeetCode 33: Search in Rotated Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 33 解題筆記:旋轉後 mid 的左右一定有一邊是排序好的,判斷目標在不在那一邊,在就往那邊找,不在就去另一邊
LeetCode 34: Find First and Last Position of Element in Sorted Array
·1 分鐘
LeetCode Medium Array Binary-Search
LeetCode 34 解題筆記:做兩次 lower bound:第一個 >= target 的位置,以及第一個 >= target + 1 的位置減一