题目
给你用户在 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 。
示例
- 输入:logs = [[0,5],[1,2],[0,2],[0,5],[1,3]], k = 5
- 输出:[0,2,0,0,0]
- 解释:ID=0 的用户执行操作的分钟分别是:5 、2 和 5 。因此,该用户的用户活跃分钟数为 2(分钟 5 只计数一次)ID=1 的用户执行操作的分钟分别是:2 和 3 。因此,该用户的用户活跃分钟数为 22 个用户的用户活跃分钟数都是 2 ,answer[2] 为 2 ,其余 answer[j] 的值都是 0
题解
这个题目其实很简单就是题解读了半天,感觉出题人需要提高表述水平。题目很简单很给了一个logs日志,该列表中每一个元素均有两个值,第一个表示ID,第二个表示时间。用户活跃分钟数表示一个用户操作的时间数,这个需要去重,因此考虑使用集合。最后需要根据给定的k,求出用户活跃分钟数等于1到k的ID数,这又需要一个哈希表来表示key为统计的个数,value为用户数。
下面根据题意来进行实现,首先需要计算每个用户的 用户活跃分钟数。然后构建一个如下的哈希表:
接下来需要统计每个用户活跃分钟数的用户数,这需要根据上面的hash表计算每个集合的长度,然后以这个长度为key,以id的个数为value再构建一个哈希表。
最后直接根据这个哈希表与1到k进行匹配,没有的为0有的直接添加到列表即可。
代码如下:
class Solution:
def findingUsersActiveMinutes(self, logs: List[List[int]], k: int) -> List[int]:
log_dic={}
for item in logs:
id=item[0]
time=item[1]
curr_set=log_dic.get(id,set())
curr_set.add(time)
log_dic[id]=curr_set
count_dic={}
for key in log_dic:
set_num=len(log_dic[key])
count_dic[set_num]=count_dic.get(set_num,0)+1
result=[]
for j in range(1,k+1):
result.append(count_dic.get(j,0))
return result
计算复杂度
- 时间复杂度。两个哈希表的构建用时最长为 O ( n ) O(n) O(n),遍历1到k的复杂度为 O ( k ) O(k) O(k),因此总的时间复杂度为 O ( n + k ) O(n+k) O(n+k)。
- 空间复杂度。两个哈希表的存储长度为 O ( 2 n ) O(2n) O(2n),记为 O ( n ) O(n) O(n),返回结果的列表不计,总的空间复杂度为 O ( n ) O(n) O(n)。