Leetcode-每日一题1604. 警告一小时内使用相同员工卡大于等于三次的人(哈希表 + 快排)

该问题通过哈希表存储每个员工的刷卡时间,然后对每个员工的时间进行排序,通过比较相邻时间差判断是否在一小时范围内出现三次刷卡,最后返回收到警告的员工名字,按字典序排序。时间复杂度主要花费在排序上,为O(nlogn),空间复杂度为O(n)。
摘要由CSDN通过智能技术生成

在这里插入图片描述
题目链接:https://leetcode.cn/problems/alert-using-same-key-card-three-or-more-times-in-a-one-hour-period/description/

思路

题目意思

这题有两个数组 keyName 和 keyTime 分别代表员工名字和员工一天内刷卡的时间,让你找有多少员工一小时内出现三次即以上的刷卡记录,则会收到系统警告,我们需要把系统警告到员工数组 字典序升序 排序后返回

方法:哈希表 + 快排

看到这题我的第一想法是哈希表记录每个员工一天的刷卡时间数组,再用滑动窗口判断是否出现一小时内出现三次即以上的刷卡记录,但是题目并没有给出数据是按照升序或者降序出来的,所以我们需要在做一步排序操作。

仔细思考其实不需要滑动窗口,因为他不需要统计一个小时出现了多少次刷卡记录,所以我们排序后,只需要判断 v[i] 与 v[i+2](v数组指某个员工的一天刷卡记录升序排序后的数组)相减是否小于等于 60 即可。

代码示例

func alertNames(keyName []string, keyTime []string) (ans []string) {
    mp := make(map[string][]int)
    for i := range keyName {
        // 将 HH:MM 换算成时间戳
        mp[keyName[i]] = append(mp[keyName[i]], (int(keyTime[i][0] - '0') * 10 + int(keyTime[i][1] - '0')) * 60 + (int(keyTime[i][3] - '0') * 10 + int(keyTime[i][4] - '0')))
    }
    for k, v := range mp {
        // sort包语法糖快排
        sort.Ints(v)
        for i := 0; i < len(v) - 2; i++ {
            if v[i + 2] -  v[i] <= 60 {
                ans = append(ans, k)
                break
            }
        }
    }
    sort.Strings(ans)
    return ans
}

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(nlog⁡n),其中 n 是数组 keyName 和 keyTime 的长度。 需要遍历数组 keyName 和 keyTime,得到每个员工的全部使用员工卡的时间,遍历的时间复杂度是 O(n),存入哈希表的时间复杂度是 O(1),因此时间复杂度是 O(n)。 然后判断每个员工是否收到系统警告,需要进行排序和遍历的操作,最坏情况下,排序的时间复杂度是 O(nlog⁡n),遍历的时间复杂度是 O(n),因此时间复杂度是 O(nlog⁡n)。 因此总时间复杂度是 O(nlog⁡n)。

  • 空间复杂度:O(n),其中 n 是数组 keyName 和 keyTime 的长度。空间复杂度主要取决于哈希表,需要存储所有员工的全部打卡时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lin钟一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值