題目連結(jié):
題目意譯:
你被給定一個索引值從 0 開始的整數(shù)陣列 piles 其中 piles[i] 代表著第 i 堆有的石頭數(shù)量,以及一整數(shù) k。你應(yīng)套用以下操作恰好 k 次:
選擇任一個 piles[i] 並從中移除 floor(piles[i] ÷ 2) 個石頭。
注意,你可以套用多次該操作於同一堆石頭上。
回傳經(jīng)過 k 次操作後最小可能的石頭總數(shù)。
floor(x) 為小於等於 x 的最大整數(shù)(即向下取整)。
限制:
1 ≦ piles.length ≦ 10 ^ 5
1 ≦ piles[i] ≦ 10 ^ 4
1 ≦ k ≦ 10 ^ 5
範例測資:
範例 1:
輸入: piles = [5,4,9], k = 2
輸出: 12
解釋: 一個可能情境之步驟為:
- 套用操作於第 2 堆。結(jié)果之 piles 為 [5,4,5]。
- 套用操作於第 0 堆。結(jié)果之 piles 為 [3,4,5]。
[3,4,5] 中的石頭總數(shù)為 12。
範例 2:
輸入: piles = [4,3,6,7], k = 3
輸出: 12
解釋: 一個可能情境之步驟為:
- 套用操作於第 3 堆。結(jié)果之 piles 為 [4,3,3,7]。
- 套用操作於第 4 堆。結(jié)果之 piles 為 [4,3,3,4]。
- 套用操作於第 0 堆。結(jié)果之 piles 為 [2,3,3,4]。
[2,3,3,4] 中的石頭總數(shù)為 12。
解題思維:
因為要讓石頭剩下盡可能地少,因此每次移除石頭應(yīng)從 piles 中目前石頭最多的堆去套用操作(才會使 floor(piles[i] ÷ 2) 之值最大)。
因此可以利用一個優(yōu)先佇列(Priority Queue)來得到每次操作中的最大堆。每次移除完最大堆裡的石頭後記得將該堆的石頭數(shù)量放回到優(yōu)先佇列中(因為可以套用多次操作於同一堆石頭上)。
最後剩下的石頭總和即是所求最小值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。