Welcome to Subscribe On Youtube

Formatted question description: https://leetcode.ca/all/2593.html

2593. Find Score of an Array After Marking All Elements

Description

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 <= 105
  • 1 <= nums[i] <= 106

Solutions

  • class Solution {
        public long findScore(int[] nums) {
            int n = nums.length;
            boolean[] vis = new boolean[n];
            PriorityQueue<int[]> q = new PriorityQueue<>((a, b) -> a[0] == b[0] ? a[1] - b[1] : a[0] - b[0]);
            for (int i = 0; i < n; ++i) {
                q.offer(new int[] {nums[i], i});
            }
            long ans = 0;
            while (!q.isEmpty()) {
                var p = q.poll();
                ans += p[0];
                vis[p[1]] = true;
                for (int j : List.of(p[1] - 1, p[1] + 1)) {
                    if (j >= 0 && j < n) {
                        vis[j] = true;
                    }
                }
                while (!q.isEmpty() && vis[q.peek()[1]]) {
                    q.poll();
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        long long findScore(vector<int>& nums) {
            int n = nums.size();
            vector<bool> vis(n);
            using pii = pair<int, int>;
            priority_queue<pii, vector<pii>, greater<pii>> q;
            for (int i = 0; i < n; ++i) {
                q.emplace(nums[i], i);
            }
            long long ans = 0;
            while (!q.empty()) {
                auto [x, i] = q.top();
                q.pop();
                ans += x;
                vis[i] = true;
                if (i + 1 < n) {
                    vis[i + 1] = true;
                }
                if (i - 1 >= 0) {
                    vis[i - 1] = true;
                }
                while (!q.empty() && vis[q.top().second]) {
                    q.pop();
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def findScore(self, nums: List[int]) -> int:
            n = len(nums)
            vis = [False] * n
            q = [(x, i) for i, x in enumerate(nums)]
            heapify(q)
            ans = 0
            while q:
                x, i = heappop(q)
                ans += x
                vis[i] = True
                for j in (i - 1, i + 1):
                    if 0 <= j < n:
                        vis[j] = True
                while q and vis[q[0][1]]:
                    heappop(q)
            return ans
    
    
  • func findScore(nums []int) (ans int64) {
    	h := hp{}
    	for i, x := range nums {
    		heap.Push(&h, pair{x, i})
    	}
    	n := len(nums)
    	vis := make([]bool, n)
    	for len(h) > 0 {
    		p := heap.Pop(&h).(pair)
    		x, i := p.x, p.i
    		ans += int64(x)
    		vis[i] = true
    		for _, j := range []int{i - 1, i + 1} {
    			if j >= 0 && j < n {
    				vis[j] = true
    			}
    		}
    		for len(h) > 0 && vis[h[0].i] {
    			heap.Pop(&h)
    		}
    	}
    	return
    }
    
    type pair struct{ x, i int }
    type hp []pair
    
    func (h hp) Len() int            { return len(h) }
    func (h hp) Less(i, j int) bool  { return h[i].x < h[j].x || (h[i].x == h[j].x && h[i].i < h[j].i) }
    func (h hp) Swap(i, j int)       { h[i], h[j] = h[j], h[i] }
    func (h *hp) Push(v interface{}) { *h = append(*h, v.(pair)) }
    func (h *hp) Pop() interface{}   { a := *h; v := a[len(a)-1]; *h = a[:len(a)-1]; return v }
    
  • interface pair {
        x: number;
        i: number;
    }
    
    function findScore(nums: number[]): number {
        const q = new PriorityQueue({
            compare: (a: pair, b: pair) => (a.x === b.x ? a.i - b.i : a.x - b.x),
        });
        const n = nums.length;
        const vis: boolean[] = new Array(n).fill(false);
        for (let i = 0; i < n; ++i) {
            q.enqueue({ x: nums[i], i });
        }
        let ans = 0;
        while (!q.isEmpty()) {
            const { x, i } = q.dequeue()!;
            if (vis[i]) {
                continue;
            }
            ans += x;
            vis[i] = true;
            if (i - 1 >= 0) {
                vis[i - 1] = true;
            }
            if (i + 1 < n) {
                vis[i + 1] = true;
            }
            while (!q.isEmpty() && vis[q.front()!.i]) {
                q.dequeue();
            }
        }
        return ans;
    }
    
    

All Problems

All Solutions