Welcome to Subscribe On Youtube

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

1817. Finding the Users Active Minutes

Level

Medium

Description

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] = [ID_i, time_i] indicates that the user with ID_i performed an action at the minute time_i.

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:

  • 1 <= logs.length <= 10^4
  • 0 <= ID_i <= 10^9
  • 1 <= time_i <= 10^5
  • k is in the range [The maximum UAM for a user, 10^5].

Solution

Use a map to store each user’s active minutes, where the active minutes are stored in a set. Then for each user, obtain the number of active minutes, and update the array answer accordingly. Finally, return answer.

  • class Solution {
        public int[] findingUsersActiveMinutes(int[][] logs, int k) {
            int[] answer = new int[k];
            Map<Integer, Set<Integer>> map = new HashMap<Integer, Set<Integer>>();
            for (int[] log : logs) {
                int id = log[0], time = log[1];
                Set<Integer> set = map.getOrDefault(id, new HashSet<Integer>());
                set.add(time);
                map.put(id, set);
            }
            for (Map.Entry<Integer, Set<Integer>> entry : map.entrySet()) {
                int size = entry.getValue().size();
                answer[size - 1]++;
            }
            return answer;
        }
    }
    
    ############
    
    class Solution {
        public int[] findingUsersActiveMinutes(int[][] logs, int k) {
            Map<Integer, Set<Integer>> d = new HashMap<>();
            for (var log : logs) {
                int i = log[0], t = log[1];
                d.computeIfAbsent(i, key -> new HashSet<>()).add(t);
            }
            int[] ans = new int[k];
            for (var ts : d.values()) {
                ++ans[ts.size() - 1];
            }
            return ans;
        }
    }
    
  • // OJ: https://leetcode.com/problems/finding-the-users-active-minutes/
    // Time: O()
    // Space: O()
    class Solution {
    public:
        vector<int> findingUsersActiveMinutes(vector<vector<int>>& A, int k) {
            unordered_map<int, unordered_set<int>> m;
            for (auto &v : A) {
                int id = v[0], time = v[1];
                m[id].insert(time);
            }
            vector<int> ans(k);
            for (auto &[id, s] : m) {
                int cnt = s.size();
                if (cnt <= k) ans[cnt - 1]++;
            }
            return ans;
        }
    };
    
  • class Solution:
        def findingUsersActiveMinutes(self, logs: List[List[int]], k: int) -> List[int]:
            d = defaultdict(set)
            for i, t in logs:
                d[i].add(t)
            ans = [0] * k
            for ts in d.values():
                ans[len(ts) - 1] += 1
            return ans
    
    ############
    
    # 1817. Finding the Users Active Minutes
    # https://leetcode.com/problems/finding-the-users-active-minutes/
    
    class Solution:
        def findingUsersActiveMinutes(self, logs: List[List[int]], k: int) -> List[int]:
            res = [0] * k
            mp = collections.defaultdict(set)
            
            for i, time in logs:
                mp[i].add(time)
            
            for v in mp.values():
                res[len(v) - 1] += 1
            
            return res
    
    
  • func findingUsersActiveMinutes(logs [][]int, k int) []int {
    	d := map[int]map[int]bool{}
    	for _, log := range logs {
    		i, t := log[0], log[1]
    		if _, ok := d[i]; !ok {
    			d[i] = make(map[int]bool)
    		}
    		d[i][t] = true
    	}
    	ans := make([]int, k)
    	for _, ts := range d {
    		ans[len(ts)-1]++
    	}
    	return ans
    }
    
  • function findingUsersActiveMinutes(logs: number[][], k: number): number[] {
        const d: Map<number, Set<number>> = new Map();
        for (const [i, t] of logs) {
            if (!d.has(i)) {
                d.set(i, new Set<number>());
            }
            d.get(i)!.add(t);
        }
        const ans: number[] = Array(k).fill(0);
        for (const [_, ts] of d) {
            ++ans[ts.size - 1];
        }
        return ans;
    }
    
    

All Problems

All Solutions