前往
大廳
主題

LeetCode - 1011. Capacity To Ship Packages Within D Days 解題心得

Not In My Back Yard | 2024-01-08 12:00:18 | 巴幣 0 | 人氣 63

題目連結:


題目意譯:
有一條運輸帶有一些包裹需要從某個港口在 days 天內運至另一個港口。

在運輸帶上的第 i 個包裹之重量為 weights[i]。每一天,我們將在運輸帶上的某些包裹裝載至船上(以 weights 給定的順序)。我們不得裝載至使得包裹總重量超過該船隻的最大限重。

回傳在可以把運輸帶上所有包裹在 days 天運至目的地最少所需的船隻限重。

限制:
1 ≦ days ≦ weights.length ≦ 5 × 10 ^ 4
1 ≦ weights[i] ≦ 500



範例測資:
範例 1:
輸入: weights = [1,2,3,4,5,6,7,8,9,10], days = 5
輸出: 15
解釋: 一艘限重為 15 的船隻便足以在 5 天內把所有包裹送至目的地,如下:
第 1 天: 1, 2, 3, 4, 5
第 2 天: 6, 7
第 3 天: 8
第 4 天: 9
第 5 天: 10
注意到這些包裹必須以給定的順序來運輸,所以如果船隻限重為 14 且將包裹們分成如 (2, 3, 4, 5) 、 (1, 6, 7) 、 (8) 、 (9) 、 (10) 之部分是不被允許的。

範例 2:
輸入: weights = [3,2,2,4,1,4], days = 3
輸出: 6
解釋: 一艘限重為 6 的船隻便足以在 3 天內把所有包裹送至目的地,如下:
第 1 天: 3, 2
第 2 天: 2, 4
第 3 天: 1, 4

範例 3:
輸入: weights = [1,2,3,1,1], days = 4
輸出: 3
解釋:
第 1 天: 1
第 2 天: 2
第 3 天: 3
第 4 天: 1, 1


解題思維:
可以看到對於某個限重值 M,要檢查是否可以在 days 天內把所有包裹運完很簡單——從第一個包裹開始裝載到船上,一路裝到裝不下為止,而這就是第一天的運送量;接著第二天就從前一天沒裝到的包裹開始繼續裝,以此類推。而如果最後的天數 ≦ days,則代表我們限重 M 是可行的;反之,則不可行。

並且可以看到如果某個限重值 x 不可行,則 x - 1 、 x - 2 等也不可行;而如果 y 可行,則代表 y + 1 、 y + 2 等都可行。因此我們可以採取如這題一樣的策略,即對「答案」(也就是所求的限重)進行二分搜尋法(Binary Search)來找到最小且可行的限重值。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作