leetcode 1817. 查找用户活跃分钟数【python3,哈希表的实现思路详解】

题目

给你用户在 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为用户数。

下面根据题意来进行实现,首先需要计算每个用户的 用户活跃分钟数。然后构建一个如下的哈希表:
image.png

接下来需要统计每个用户活跃分钟数的用户数,这需要根据上面的hash表计算每个集合的长度,然后以这个长度为key,以id的个数为value再构建一个哈希表。
image.png

最后直接根据这个哈希表与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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值