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

LeetCode 1011: Capacity To Ship Packages Within D Days

·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 第一次嘗試:2026-11-03

  • 提交紀錄:Accepted(一次通過)

解題思路
#

容量越大,需要的天數越少,有單調性,所以對答案二分(Binary Search 模板二):

  • 下界是 max(weights):包裹不能拆,容量比最重的包裹小就永遠裝不了。
  • 上界是 sum(weights):一天就全部運完。
  • 檢查:照順序裝,裝不下就開新的一天,最後看天數有沒有超過 days。

要找的是可行的最小容量。

我的嘗試
#

一次通過。跟 LC 875 同一天寫,用的是同一個左閉右閉模板:可行就 right = mid - 1,否則 left = mid + 1,最後回傳 left。

正確解法
#

class Solution:
    def shipWithinDays(self, weights: List[int], days: int) -> int:
        def valid(cap):
            need, curr = 1, 0
            for w in weights:
                if curr + w <= cap:
                    curr += w
                else:                 # 裝不下,開新的一天
                    need += 1
                    curr = w
            return need <= days

        left, right = max(weights), sum(weights)
        while left <= right:
            mid = (left + right) // 2
            if valid(mid):
                right = mid - 1
            else:
                left = mid + 1
        return left

複雜度
#

時間 O(n log S),S 是 sum(weights);空間 O(1)。

要特別避免的錯誤
#

  • 下界寫成 1:valid 沒有檢查單一包裹比容量大的情況,開了新的一天就當作裝得下。weights = [1, 5]、days = 2 會回傳 1,答案是 5。下界設成 max(weights),就不用另外檢查。
  • 天數要從 1 開始算,第一天也算一天。

面試口說整理
#

容量越大天數越少,所以對答案二分。下界是最重的包裹,因為包裹不能拆;上界是全部的重量,一天就能運完。檢查時照順序裝,裝不下就開新的一天,看天數有沒有超過限制。找可行的最小容量。時間 O(n log S),空間 O(1)。

相關文章

LeetCode 2563: Count the Number of Fair Pairs
·2 分鐘
LeetCode Medium Two-Pointers Sorting Binary-Search Array
LeetCode 2563 解題筆記:把「和落在 [lower, upper]」拆成「和 <= upper」減「和 <= lower - 1」,每個都用排序後的對撞指針 O(n) 數
LeetCode 1498: Number of Subsequences That Satisfy the Given Sum Condition
·2 分鐘
LeetCode Medium Two-Pointers Sorting Binary-Search Array
LeetCode 1498 解題筆記:子序列只看最小值和最大值,排序後順序無關;固定最小值 nums[left],中間的元素任意選,共 2^(right - left) 種
LeetCode 825: Friends Of Appropriate Ages
·2 分鐘
LeetCode Medium Two-Pointers Sorting Binary-Search Array
LeetCode 825 解題筆記:排序後,每個人能送出邀請的對象是年齡落在 (0.5 × age + 7, age] 的一段區間,用兩個同向指針維護區間再扣掉自己
LeetCode 3413: Maximum Coins From K Consecutive Bags
·2 分鐘
LeetCode Medium Sliding-Window Greedy Sorting Prefix-Sum Binary-Search Array
LeetCode 3413 解題筆記:最佳的 k 個袋子,一定有一端對齊某段的端點;分別算「左端對齊段的起點」和「右端對齊段的終點」(鏡像後重用同一個函式)
LeetCode 2779: Maximum Beauty of an Array After Applying Operation
·1 分鐘
LeetCode Medium Sliding-Window Sorting Binary-Search Array
LeetCode 2779 解題筆記:每個數可以變成 [x - k, x + k] 裡的任何值,一群數能變成同一個值 ⇔ 最大 - 最小 <= 2k;排序後找最長的這種視窗
LeetCode 2831: Find the Longest Equal Subarray
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table Binary-Search Array
LeetCode 2831 解題筆記:對每個值,把它出現的位置列出來;在位置列表上滑動視窗,要刪的數量 = 位置跨度 − 這個值的個數