LeetCode 1817. 查找用户活跃分钟数 Map、Set题解,本题读懂题最重要。
1817. 查找用户活跃分钟数#
https://leetcode.cn/problems/finding-the-users-active-minutes/
给你用户在 LeetCode 的操作日志,和一个整数 k 。日志用一个二维整数数组 logs 表示,其中每个 logs[i] = [IDi, timei] 表示 ID 为 IDi 的用户在 timei 分钟时执行了某个操作。
多个用户 可以同时执行操作,单个用户可以在同一分钟内执行 多个操作 。
指定用户的 用户活跃分钟数(user active minutes,UAM) 定义为用户对 LeetCode 执行操作的 唯一分钟数 。 即使一分钟内执行多个操作,也只能按一分钟计数。
请你统计用户活跃分钟数的分布情况,统计结果是一个长度为 k 且 下标从 1 开始计数 的数组 answer ,对于每个 j(1 <= j <= k),answer[j] 表示 用户活跃分钟数 等于 j 的用户数。
返回上面描述的答案数组 answer 。
这个题不知道为啥读起来难懂!
题目核心求的是 用户活跃时长 -> 对应用户数。
其中针对某分钟内同一用户的操作,计数需去重。
我们可以使用
1
|
Map<Integer, Set<Integer>> userId2Minutes
|
来统计每个用户活跃的分钟数据,使用Set即可保证分钟数据去重。
之后再遍历一次,即可得出分钟数对应的用户数。
使用Map、Set#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/*
* 执行用时:
* 17 ms
* , 在所有 Java 提交中击败了
* 64.17%
* 的用户
* 内存消耗:
* 51.8 MB
* , 在所有 Java 提交中击败了
* 15.84%
* 的用户
* 通过测试用例:
* 38 / 38
*/
public int[] findingUsersActiveMinutes(int[][] logs, int k) {
Map<Integer, Set<Integer>> userId2Minutes = new HashMap<>();
for (int[] log : logs) {
int userId = log[0];
int minute = log[1];
userId2Minutes.putIfAbsent(userId, new HashSet<>());
Set<Integer> minutes = userId2Minutes.get(userId);
minutes.add(minute);
}
int[] ans = new int[k];
for (Map.Entry<Integer, Set<Integer>> entry : userId2Minutes.entrySet()) {
Set<Integer> minutes = entry.getValue();
ans[minutes.size() - 1] = ans[minutes.size() - 1] + 1;
}
return ans;
}
|
复杂度#
m:logs行数
n:logs列数
对数据遍历了行数,两次,复杂度O(m)。
额外使用了userId2Minutes统计过程数据,叠加占用O(n*m)。