前往
大廳
主題

LeetCode - 2530. Maximal Score After Applying K Operations 解題心得

Not In My Back Yard | 2023-12-02 12:00:08 | 巴幣 100 | 人氣 64

題目連結:


題目意譯:
你被給定一個索引值從 0 開始的整數陣列 nums 以及一整數 k。你一開始有著一個分數值 0。

在一次操作中:
選擇一個索引值 i 滿足 0 ≦ i < nums.length;
將你的分數增加 nums[i];
並且將 nums[i] 替換成 ceil(nums[i] / 3)。

回傳執行恰好 k 次操作後你能得到的最大分數值。

ceiling 函式 ceil(val) 代表著大於等於 val 的最小整數。

限制:
1 ≦ nums.length, k ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 9



範例測資:
範例 1:
輸入: nums = [10,10,10,10,10], k = 5
輸出: 50
解釋: 在每一個元素各自執行恰好一次操作。最終分數為 10 + 10 + 10 + 10 + 10 = 50。

範例 2:
輸入: nums = [1,10,3,3,3], k = 3
輸出: 17
解釋: 你可以執行以下操作:
操作 1:選擇 i = 1,所以 nums 變成 [1,4,3,3,3]。你的分數增加 10。
操作 2:選擇 i = 1,所以 nums 變成 [1,2,3,3,3]。你的分數增加 4。
操作 3:選擇 i = 2,所以 nums 變成 [1,1,1,3,3]。你的分數增加 3。
最終分數為 10 + 4 + 3 = 17。


解題思維:
可以看到為了最大化最終分數值,每次操作應取 nums 中當下最大的數字(如有多個,則隨便取一個)。

因此我們可以使用一個優先佇列(Priority Queue)來為 k 次操作找到當下各自的最大值(記得要把該最大值 x 更新為 ceil(x / 3) 並放回優先佇列中,因為之後有可能還是會用到此數)。然後把這 k 次取到的數字加總即為所求。




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

創作回應

更多創作