diff --git a/solutions/2500-2599/2530-maximal-score-after-applying-k-operations-medium.md b/solutions/2500-2599/2530-maximal-score-after-applying-k-operations-medium.md index 45f16b446ba..56a7dc2861d 100644 --- a/solutions/2500-2599/2530-maximal-score-after-applying-k-operations-medium.md +++ b/solutions/2500-2599/2530-maximal-score-after-applying-k-operations-medium.md @@ -1,8 +1,9 @@ --- -description: 'Author: @wingkwong | https://leetcode.com/problems/maximal-score-after-applying-k-operations/' +description: "Author: @wingkwong | https://leetcode.com/problems/maximal-score-after-applying-k-operations/" +tags: [Array, Greedy, Heap (Priority Queue)] --- -# 2530 - Maximal Score After Applying K Operations (Medium) +# 2530 - Maximal Score After Applying K Operations (Medium) ## Problem Link @@ -18,7 +19,7 @@ In one **operation**: 2. increase your **score** by `nums[i]`, and 3. replace `nums[i]` with `ceil(nums[i] / 3)`. -Return *the maximum possible **score** you can attain after applying **exactly*** `k` *operations*. +Return \*the maximum possible **score** you can attain after applying **exactly\*** `k` _operations_. The ceiling function `ceil(val)` is the least integer greater than or equal to `val`. @@ -49,6 +50,12 @@ The final score is 10 + 4 + 3 = 17. ## Approach 1: Priority Queue +When you see a question asking you to find something maximum / minimum after `K` operations. It's a hint that this could be solved by priority queue. + +In this question, it is easy to see that we should apply the operation on the largest number each time (i.e. greedy approach). If we just write a brute force solution, after each operation, we need to iterate `nums` again to find out the largest number which costs $O(n)$ where $n$ is the number of elements in `nums` and this happens $K$ times, which is not efficient. + +To optimise the solution, we can apply priority queue / heap (in python) so that we could find the largest number efficiently, which takes $O(1)$ for finding the max number. + @@ -63,11 +70,11 @@ public: // perform k rounds while (k--) { // get the max one - int t = pq.top(); + int t = pq.top(); // pop it out pq.pop(); // add to answer - ans += t; + ans += t; // add the ceil value // ceil(x / y) = (x + y - 1) / y // ceil(t / 3) = (t + 3 - 1) / 3 = (t + 2) / 3 @@ -79,4 +86,32 @@ public: ``` - \ No newline at end of file + + + + +```py +class Solution: + def maxKelements(self, nums: List[int], k: int) -> int: + res = 0 + # we want to take the max one in each round + # create a max heap by pushing negative values + mx_heap = [-num for num in nums] + heapq.heapify(mx_heap) + # perform k rounds + while k > 0: + k -= 1 + # get the max one (negative because of max-heap simulation) + t = -heapq.heappop(mx_heap) + # add to answer + res += t + # push the ceil value of t / 3 back into the heap + # ceil(x / y) = (x + y - 1) / y + # ceil(t / 3) = (t + 3 - 1) / 3 = (t + 2) / 3 + heapq.heappush(mx_heap, -((t + 2) // 3)) + return res +``` + + + +