題目連結:
題目意譯:
你有著 n 個編號 0 到 n - 1 的袋子。你被給定兩個索引值從 0 開始的整數陣列 capacity 和 rocks。第 i 個袋子可以容納最多 capacity[i] 顆石頭且目前容納著 rocks[i] 顆石頭。你同時被給定一個整數 additionalRocks,代表著你可以放入任一個袋子中的石頭數量。
回傳將額外的石頭放入某些袋子中後最多會有袋子會裝滿。
限制:
n == capacity.length == rocks.length
1 ≦ n ≦ 5 × 10 ^ 4
1 ≦ capacity[i] ≦ 10 ^ 9
0 ≦ rocks[i] ≦ capacity[i]
1 ≦ additionalRocks ≦ 10 ^ 9
範例測資:
範例 1:
輸入: capacity = [2,3,4,5], rocks = [1,2,4,4], additionalRocks = 2
輸出: 3
解釋:
將 1 顆石頭放入 0 號袋子中以及放入 1 顆石頭到 1 號袋子中。
每一個袋子中的石頭數量現在為 [2,3,4,4]。
0 、 1 和 2 號袋子是滿的。
有 3 個袋子是裝滿的,所以我們回傳 3。
可以證明不可能裝滿多於 3 個袋子。
注意到可能有多個放置石頭的方式來得到答案為 3 的結果。
範例 2:
輸入: capacity = [10,2,2], rocks = [2,2,0], additionalRocks = 100
輸出: 3
解釋:
將 8 顆石頭放入 0 號袋子中以及放入 2 顆石頭到 2 號袋子中。
每一個袋子中的石頭數量現在為 [10,2,2]。
0 、 1 和 2 號袋子是滿的。
有 3 個袋子是裝滿的,所以我們回傳 3。
可以證明不可能裝滿多於 3 個袋子。
注意到我們不需要使用掉全部額外的石頭。
解題思維:
先掃過一次每一個袋子(capacity 和 rocks),然後求出每一個袋子 i 還需要多少石頭才能裝滿,即 capacity[i] - rocks[i]。
然後把這些「需求」用一個優先佇列(Priority Queue)(或是直接排序也可以)。
接著,一直把需求最小值從佇列中拿出來,將 additionalRocks 減去該值。重複此步驟直到 additionalRocks 小於當前需求最小值為止。
看過程中裝滿多少袋子即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。