2593. Find Score of an Array After Marking All Elements
Difficulty: Medium
Topics: Heap (Priority Queue), Sorting, Array, Simulation, Hash Table, Ordered Set, Ordered Map, Greedy, Monotonic Stack, Sliding Window, Two Pointers, Stack, Queue, Bit Manipulation, Divide and Conquer, Dynamic Programming, Doubly-Linked List, Data Stream, Radix Sort, Backtracking, Bitmask, Tree, Design, Hash Function, String, Iterator, Counting Sort, Linked List
You are given an array nums consisting of positive integers.
Starting with score = 0, apply the following algorithm:
- Choose the smallest integer of the array that is not marked. If there is a tie, choose the one with the smallest index.
- Add the value of the chosen integer to
score. - Mark the chosen element and its two adjacent elements if they exist.
- Repeat until all the array elements are marked.
Return the score you get after applying the above algorithm.
Example 1:
- Input: nums = [2,1,3,4,5,2]
- Output: 7
-
Explanation: We mark the elements as follows:
- 1 is the smallest unmarked element, so we mark it and its two adjacent elements: [2,1,3,4,5,2].
- 2 is the smallest unmarked element, so we mark it and its left adjacent element: [2,1,3,4,5,2].
- 4 is the only remaining unmarked element, so we mark it: [2,1,3,4,5,2].
- Our score is 1 + 2 + 4 = 7.
Example 2:
- Input: nums = [2,3,5,1,3,2]
- Output: 5
-
Explanation: We mark the elements as follows:
- 1 is the smallest unmarked element, so we mark it and its two adjacent elements: [2,3,5,1,3,2].
- 2 is the smallest unmarked element, since there are two of them, we choose the left-most one, so we mark the one at index 0 and its right adjacent element: [2,3,5,1,3,2].
- 2 is the only remaining unmarked element, so we mark it: [2,3,5,1,3,2].
- Our score is 1 + 2 + 2 = 5.
Constraints:
1 <= nums.length <= 1051 <= nums[i] <= 106
Hint:
- Try simulating the process of marking the elements and their adjacent.
- If there is an element that was already marked, then you skip it.
Solution:
We can simulate the marking process efficiently by using a sorted array or priority queue to keep track of the smallest unmarked element. So we can use the following approach:
Plan:
-
Input Parsing: Read the array
numsand initialize variables for the score and marking status. -
Heap (Priority Queue):
- Use a min-heap to efficiently extract the smallest unmarked element in each step.
- Insert each element into the heap along with its index
(value, index)to manage ties based on the smallest index.
-
Marking Elements:
- Maintain a
markedarray to track whether an element and its adjacent ones are marked. - When processing an element from the heap, skip it if it is already marked.
- Mark the current element and its two adjacent elements (if they exist).
- Add the value of the current element to the score.
- Maintain a
- Repeat: Continue until all elements are marked.
- Output: Return the accumulated score.
Let's implement this solution in PHP: 2593. Find Score of an Array After Marking All Elements
<?php
/**
* @param Integer[] $nums
* @return Integer
*/
function findScore($nums) {
...
...
...
/**
* go to ./solution.php
*/
}
// Example usage:
$nums1 = [2, 1, 3, 4, 5, 2];
$nums2 = [2, 3, 5, 1, 3, 2];
echo findScore($nums1) . "\n"; // Output: 7
echo findScore($nums2) . "\n"; // Output: 5
?>
Explanation:
-
Heap Construction:
- The
usortfunction sorts the array based on values, and by index when values are tied. - This ensures that we always process the smallest unmarked element with the smallest index.
- The
-
Marking Logic:
- For each unmarked element, we mark it and its adjacent elements using the
markedarray. - This ensures that we skip previously marked elements efficiently.
- For each unmarked element, we mark it and its adjacent elements using the
-
Time Complexity:
- Sorting the heap: O(n log n)
- Processing the heap: O(n)
- Overall: O(n log n), which is efficient for the given constraints.
-
Space Complexity:
- Marked array: O(n)
- Heap: O(n)
- Total: O(n)
This solution meets the constraints and works efficiently for large inputs.
Contact Links
If you found this series helpful, please consider giving the repository a star on GitHub or sharing the post on your favorite social networks 😍. Your support would mean a lot to me!
![]()
If you want more helpful content like this, feel free to follow me:
Top comments (0)