前往
大廳
主題

LeetCode - 1561. Maximum Number of Coins You Can Get 解題心得

Not In My Back Yard | 2024-04-10 12:00:10 | 巴幣 1000 | 人氣 35

題目連結:


題目意譯:
現在有 3n 堆大小不同的金幣堆,你和你的朋友將會按照以下方式拿走金幣堆:
    在每一步中,你將會選擇任 3 堆金幣堆(不一定連續)、
    在你的選擇之中,Alice 將會挑走金幣最多的一堆、
    接著,你將會挑剩下的金幣最多的一堆、
    你的朋友 Bob 將會挑走最後剩下的那一堆、
    重複以上步驟直到沒有金幣堆剩下。

給定一整數陣列 piles,其中 piles[i] 為第 i 堆的金幣數。

回傳你可以得到的最大金幣數。

限制:
3 ≦ piles.length ≦ 10 ^ 5
piles.length % 3 == 0
1 ≦ piles[i] ≦ 10 ^ 4



範例測資:
範例 1:
輸入: piles = [2,4,1,2,7,8]
輸出: 9
解釋: 選擇三元組 (2, 7, 8),Alice 將挑走有 8 個金幣的那一堆,你則將挑走有 7 個金幣的那一堆,而 Bob 則是挑走最後剩下的那一堆。
選擇三元組 (2, 7, 8),Alice 將挑走有 4 個金幣的那一堆,你則將挑走有 2 個金幣的那一堆,而 Bob 則是挑走最後剩下的那一堆。
你能得到的最大金幣數為:7 + 2 = 9。
在另一種可能性中,如果我們選擇 (1, 2, 8) 和 (2, 4, 7) ,你將只得到 2 + 4 個金幣。而這不是最佳解。

範例 2:
輸入: piles = [2,4,5]
輸出: 4

範例 3:
輸入: piles = [9,8,7,6,5,1,2,3,4]
輸出: 18


解題思維:
可以看到 Bob 每次都只會拿到最小金幣數的那一堆,因此我們以直接讓 Bob 在每一回合中都拿到剩下的「全部」金幣堆中金幣最少者。

所以我們可以直接把 piles 排序之後,直接將金幣最少的那 n 堆直接分給 Bob。

接著由於 Alice 每次都會拿最大的,因此要最大化我們能拿的金幣數,我們需要每一回合挑剩下的金幣堆中最大的兩堆(記住第三堆已經在前面先行分配給 Bob 了)。此時 Alice 會拿走當前金幣數量最大值,而我們將拿走次大值。重複此步驟 n 回合即可以得到我們能得到的最大金幣數。




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

創作回應

更多創作