LeetCode in Kotlin

1817. Finding the Users Active Minutes

Medium

You are given the logs for users’ actions on LeetCode, and an integer k. The logs are represented by a 2D integer array logs where each logs[i] = [IDi, timei] indicates that the user with IDi performed an action at the minute timei.

Multiple users can perform actions simultaneously, and a single user can perform multiple actions in the same minute.

The user active minutes (UAM) for a given user is defined as the number of unique minutes in which the user performed an action on LeetCode. A minute can only be counted once, even if multiple actions occur during it.

You are to calculate a 1-indexed array answer of size k such that, for each j (1 <= j <= k), answer[j] is the number of users whose UAM equals j.

Return the array answer as described above.

Example 1:

Input: logs = [[0,5],[1,2],[0,2],[0,5],[1,3]], k = 5

Output: [0,2,0,0,0]

Explanation:

The user with ID=0 performed actions at minutes 5, 2, and 5 again. Hence, they have a UAM of 2 (minute 5 is only counted once).

The user with ID=1 performed actions at minutes 2 and 3. Hence, they have a UAM of 2.

Since both users have a UAM of 2, answer[2] is 2, and the remaining answer[j] values are 0.

Example 2:

Input: logs = [[1,1],[2,2],[2,3]], k = 4

Output: [1,1,0,0]

Explanation:

The user with ID=1 performed a single action at minute 1. Hence, they have a UAM of 1.

The user with ID=2 performed actions at minutes 2 and 3. Hence, they have a UAM of 2.

There is one user with a UAM of 1 and one with a UAM of 2.

Hence, answer[1] = 1, answer[2] = 1, and the remaining values are 0.

Constraints:

Solution

class Solution {
    fun findingUsersActiveMinutes(logs: Array<IntArray>, k: Int): IntArray {
        if (logs.size == 1) {
            val res = IntArray(k)
            res[0] = 1
            return res
        }
        logs.sortWith(compareBy { a: IntArray -> a[0] }.thenComparingInt { a: IntArray -> a[1] })
        val result = IntArray(k)
        var start = 1
        var prevUser = logs[0][0]
        var prevMin = logs[0][1]
        var count = 1
        while (true) {
            while (start < logs.size && prevUser == logs[start][0]) {
                if (prevMin != logs[start][1]) {
                    count++
                }
                prevMin = logs[start][1]
                start++
            }
            result[count - 1]++
            if (start >= logs.size) {
                break
            }
            count = 1
            prevUser = logs[start][0]
            prevMin = logs[start][1]
        }
        return result
    }
}