LeetCode in Kotlin

3885. Design Event Manager

Medium

You are given an initial list of events, where each event has a unique eventId and a priority.

Implement the EventManager class:

An event is called active if it has not been removed by pollHighest().

Example 1:

Input:
[“EventManager”, “pollHighest”, “updatePriority”, “pollHighest”, “pollHighest”]
[[[[5, 7], [2, 7], [9, 4]]], [], [9, 7], [], []]

Output:
[null, 2, null, 5, 9]

Explanation

EventManager eventManager = new EventManager([[5,7], [2,7], [9,4]]); // Initializes the manager with three events
eventManager.pollHighest(); // both events 5 and 2 have priority 7, so return the smaller id 2
eventManager.updatePriority(9, 7); // event 9 now has priority 7
eventManager.pollHighest(); // remaining highest priority events are 5 and 9, return 5
eventManager.pollHighest(); // return 9

Example 2:

Input:
[“EventManager”, “pollHighest”, “pollHighest”, “pollHighest”]
[[[[4, 1], [7, 2]]], [], [], []]

Output:
[null, 7, 4, -1]

Explanation

EventManager eventManager = new EventManager([[4,1], [7,2]]); // Initializes the manager with two events
eventManager.pollHighest(); // return 7
eventManager.pollHighest(); // return 4
eventManager.pollHighest(); // no events remain, return -1

Constraints:

Solution

import java.util.PriorityQueue

class EventManager(events: Array<IntArray>) {
    private val map: HashMap<Int?, Int?>
    private val pq: PriorityQueue<Pair>

    init {
        map = HashMap<Int?, Int?>()
        pq =
            PriorityQueue<Pair>(
                Comparator { a: Pair, b: Pair ->
                    if (a.priority != b.priority) {
                        return@Comparator b.priority.compareTo(a.priority)
                    }
                    a.id.compareTo(b.id)
                },
            )
        for (event in events) {
            pq.add(Pair(event[0], event[1]))
        }
    }

    fun updatePriority(eventId: Int, newPriority: Int) {
        map[eventId] = newPriority
        pq.add(Pair(eventId, newPriority))
    }

    fun pollHighest(): Int {
        if (pq.isEmpty()) {
            return -1
        }
        while (true) {
            if (pq.isEmpty()) {
                return -1
            }
            val p = pq.poll()
            val id = p.id
            val pri = p.priority
            if (map.containsKey(id)) {
                if (map[id] == pri) {
                    map[id] = Int.MAX_VALUE
                    return id
                }
            } else {
                return id
            }
        }
    }

    class Pair internal constructor(var id: Int, var priority: Int)
}

/*
 * Your EventManager object will be instantiated and called as such:
 * EventManager obj = new EventManager(events);
 * obj.updatePriority(eventId,newPriority);
 * int param_2 = obj.pollHighest();
 */