題目連結(jié):
題目意譯:
有一條運(yùn)輸帶有一些包裹需要從某個港口在 days 天內(nèi)運(yùn)至另一個港口。
在運(yùn)輸帶上的第 i 個包裹之重量為 weights[i]。每一天,我們將在運(yùn)輸帶上的某些包裹裝載至船上(以 weights 給定的順序)。我們不得裝載至使得包裹總重量超過該船隻的最大限重。
回傳在可以把運(yùn)輸帶上所有包裹在 days 天運(yùn)至目的地最少所需的船隻限重。
限制:
1 ≦ days ≦ weights.length ≦ 5 × 10 ^ 4
1 ≦ weights[i] ≦ 500
範(fàn)例測資:
範(fàn)例 1:
輸入: weights = [1,2,3,4,5,6,7,8,9,10], days = 5
輸出: 15
解釋: 一艘限重為 15 的船隻便足以在 5 天內(nèi)把所有包裹送至目的地,如下:
第 1 天: 1, 2, 3, 4, 5
第 2 天: 6, 7
第 3 天: 8
第 4 天: 9
第 5 天: 10
注意到這些包裹必須以給定的順序來運(yùn)輸,所以如果船隻限重為 14 且將包裹們分成如 (2, 3, 4, 5) 、 (1, 6, 7) 、 (8) 、 (9) 、 (10) 之部分是不被允許的。
範(fàn)例 2:
輸入: weights = [3,2,2,4,1,4], days = 3
輸出: 6
解釋: 一艘限重為 6 的船隻便足以在 3 天內(nèi)把所有包裹送至目的地,如下:
第 1 天: 3, 2
第 2 天: 2, 4
第 3 天: 1, 4
範(fàn)例 3:
輸入: weights = [1,2,3,1,1], days = 4
輸出: 3
解釋:
第 1 天: 1
第 2 天: 2
第 3 天: 3
第 4 天: 1, 1
解題思維:
可以看到對於某個限重值 M,要檢查是否可以在 days 天內(nèi)把所有包裹運(yùn)完很簡單——從第一個包裹開始裝載到船上,一路裝到裝不下為止,而這就是第一天的運(yùn)送量;接著第二天就從前一天沒裝到的包裹開始繼續(xù)裝,以此類推。而如果最後的天數(shù) ≦ days,則代表我們限重 M 是可行的;反之,則不可行。
並且可以看到如果某個限重值 x 不可行,則 x - 1 、 x - 2 等也不可行;而如果 y 可行,則代表 y + 1 、 y + 2 等都可行。因此我們可以採取如
這題一樣的策略,即對「答案」(也就是所求的限重)進(jìn)行二分搜尋法(Binary Search)來找到最小且可行的限重值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。