LeetCode题目笔记——1604. 警告一小时内使用相同员工卡大于等于三次的人

2023-11-02

题目描述

力扣公司的员工都使用员工卡来开办公室的门。每当一个员工使用一次他的员工卡,安保系统会记录下员工的名字和使用时间。如果一个员工在一小时时间内使用员工卡的次数大于等于三次,这个系统会自动发布一个 警告 。

给你字符串数组 keyName 和 keyTime ,其中 [keyName[i], keyTime[i]] 对应一个人的名字和他在 某一天 内使用员工卡的时间。

使用时间的格式是 24小时制 ,形如 "HH:MM" ,比方说 "23:51" 和 "09:49" 。

请你返回去重后的收到系统警告的员工名字,将它们按 字典序升序 排序后返回。

请注意 "10:00" - "11:00" 视为一个小时时间范围内,而 "23:51" - "00:10" 不被视为一小时内,因为系统记录的是某一天内的使用情况。

 

示例 1:

输入:keyName = ["daniel","daniel","daniel","luis","luis","luis","luis"], keyTime = ["10:00","10:40","11:00","09:00","11:00","13:00","15:00"]
输出:["daniel"]
解释:"daniel" 在一小时内使用了 3 次员工卡("10:00","10:40","11:00")。

示例 2:

输入:keyName = ["alice","alice","alice","bob","bob","bob","bob"], keyTime = ["12:01","12:00","18:00","21:00","21:20","21:30","23:00"]
输出:["bob"]
解释:"bob" 在一小时内使用了 3 次员工卡("21:00","21:20","21:30")。

示例 3:

输入:keyName = ["john","john","john"], keyTime = ["23:58","23:59","00:01"]
输出:[]

示例 4:

输入:keyName = ["leslie","leslie","leslie","clare","clare","clare","clare"], keyTime = ["13:00","13:20","14:00","18:00","18:51","19:30","19:49"]
输出:["clare","leslie"]

 

提示:

  • 1 <= keyName.length, keyTime.length <= 105
  • keyName.length == keyTime.length
  • keyTime 格式为 "HH:MM" 。
  • 保证 [keyName[i], keyTime[i]] 形成的二元对 互不相同 。
  • 1 <= keyName[i].length <= 10
  • keyName[i] 只包含小写英文字母。

题目链接

题目难度——中等

方法一:排序+哈希表

  要记录每个员工的用卡时间,我们就可以用一个字典来来存储,名字作为key,用卡时间列表为值,然后,我们对遍历这个字典,对每个员工来说,判断其有没有出现连续一小时内用卡的情况,有则加入答案,最后按序返回满足条件的名字。
  其中需要注意可能的点,一是时间的处理我们要将小时化为分钟进行判断;二是在判断时不能判断每两个连续的时间点之间的时间差是否都是一小时之内,而应该判断连续的三个时间点最大和最小的时间时间的差是否在一小时内;三是题目并没有说明每个人的时间是按序给出的,所以我们要自己给每个人的时间排序。

代码/Python

class Solution:
    def alertNames(self, keyName: List[str], keyTime: List[str]) -> List[str]:
        res = []
        useTimes = defaultdict(list)
        for name, time in zip(keyName, keyTime):
            minute = int(time[3:])
            hour = int(time[:2])
            useTimes[name].append(hour * 60 + minute)

        for name, time in useTimes.items():
            n = len(time)
            time.sort()
            
            for i in range(1, n - 1):
                if 0 <= time[i + 1] - time[i - 1] <= 60:
                    res.append(name)
                    break
            
        return sorted(res)

在这里插入图片描述
  排在前面的也是我这样写的,为什么我的就运行慢几十ms。

代码/C++

class Solution {
public:
    vector<string> alertNames(vector<string>& keyName, vector<string>& keyTime) {
        vector<string> res;
        unordered_map<string, vector<int>> useTimes;
        int len = keyName.size(), i, n, minute, hour;
        for(i = 0; i < len; i++){
            string name = keyName[i];
            string time = keyTime[i];
            minute = (time[3] - '0') * 10 + (time[4] - '0');
            hour = (time[0] - '0') * 10 + (time[1] - '0');
            useTimes[name].emplace_back(hour * 60 + minute);
        }
        for(auto &[name, time]: useTimes){
            n = time.size();
            sort(time.begin(), time.end());
            for(i = 0; i < n - 2; i++){
                if(time[i + 2] - time[i] >= 0 && time[i + 2] - time[i] <= 60){
                    res.emplace_back(name);
                    break;
                }
            }
        }
        sort(res.begin(), res.end());
        return res;
    }
};

在这里插入图片描述

总结

  最慢的地方就是排序,所以时间复杂度是O(NlogN),空间是O(N),因为用到了字典。巧了,第一次做到和官方题解一样的思路和几乎一样的代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode题目笔记——1604. 警告一小时内使用相同员工卡大于等于三次的人 的相关文章

随机推荐

  • C++ Deque(双端队列)

    什么Deque 双端队列表示双端队列 它概括了队列数据结构 即可以从前端或后端的两端进行插入和删除 Deque和vector区别 vector对于头部的插入和删除效率低 数据量越大 效率越低 deque相对而言 对头部的插入删除速度比vec
  • windows 杀掉进程 端口

    2 查找所有运行的端口 输入命令 netstat ano 该命令列出所有端口的使用情况 在列表中我们观察被占用的端口 比如是 1224 首先找到它 3 查看被占用端口对应的 PID 输入命令 netstat aon findstr 8081
  • 医学检验专业职业生涯

    1 医院检验科或血液科 检验科之间的收入差距比较大 越大医院的检验科在整个医院中地位越高 优点是大三甲医院待遇高平台好工作环境比较好 缺点是工作强度相对大 高学历人才集中所以晋升机会小 大多数人都是平平凡凡工作一辈子 工资加奖金10k 15
  • Vicuna模型权重合成及模型部署

    第一式 Vicuna模型部署 1 环境搭建 1 1 构建虚拟环境 1 2 安装FastChat 1 2 1 利用pip直接安装 1 2 2 从github下载repository然后安装 2 Vicuna Weights合成 2 1 下载v
  • mmdetection【2.3.0】RuntimeError: Error compiling objects for extension

    解决方案 vim bashrc 添加export CUDA HOME usr local cuda 10 0 source bashrc 错误 No module named mmcv ext 解决方案 pip uninstall mmcv
  • centos7安装mongodb3.4、卸载(彻底卸载)、更改root密码(最完整、最小白的教程)

    本教程通过yum安装 环境为centos7 先升级下curl yum update curl y 否则会在安装过程中报错 升级下又不会怀孕 一 创建yum文件 vi etc yum repos d mongodb org 3 4 repo
  • Python之Numpy学习(4)

    使用数组进行文件输入和输出 主要介绍三个文件文件操作函数 numpy save numpy savez 和numpy save numpy save file arr 存储的文件是以 npy为后缀 通过notepad无法打开 与该函数对应的
  • Ansible自动化运维工具之playbook剧本编写含lnmp

    1 playbook的相关知识 1 1 playbook 的简介 playbook是 一个不同于使用Ansible命令行执行方式的模式 其功能更强大灵活 简单来说 playbook是一个非常简单的配置管理和多主机部署系统 不同于任何已经存在
  • GAN与CycleGAN的结构解析

    原文链接 当下神经网络三大主流子领域 CNN RNN和GAN 今天咱们主要分享一下生成对抗网络 GAN的一些核心思想 并以CycleGAN为例进行阐述 借自 https github com eriklindernoren Keras GA
  • epoll及总结

    使用方法 基本与poll相同 生成对象改为epoll 将所有事件类型改为EPOLL类型 epll特点 epoll 效率比select poll要高 epoll监控数量比select 要多 epoll的触发方式比pollduo EPOLLET
  • RK3288:LINUX 系统编译报“recipe for target '_all' failed” 处理办法

    make Entering directory home xuzui 3288 linux buildroot GEN home xuzui 3288 linux buildroot output rockchip rk3288 Makef
  • 深入探索前端之道:JavaScript深拷贝与浅拷贝的解析与实现

    引言 前端开发中 数据的复制是一个常见的操作 尤其是在处理对象和数组时 我们需要考虑的是一个浅拷贝还是深拷贝 那么 什么是深拷贝和浅拷贝 它们在前端开发中有什么作用 如何实现这两种拷贝 这是我们在本文将讨论的问题 浅拷贝 浅拷贝是一种数据复
  • shiro和thymealeaf整合

    shiro和thymealeaf整合 一 加入依赖
  • 服务器Raid5磁盘阵列数据恢复步骤和数据恢复方法

    磁盘阵列数据恢复故障描述 客户的一台HP DL380 G4服务器 服务器使用hp smart array控制器挂载了一台国产磁盘阵列 磁盘阵列由14块146G SCSI硬盘组成一组RAID5 操作系统为LINUX 构建了NFS FTP 作为
  • Android DataBing详解

    转载于http blog csdn net qdjdeveloper article details 62236309 前几天小试牛刀写了一篇 Android DataBinding 初探 只是简单的介绍了一下 DataBinding 的几
  • 解决在谷歌浏览器上倍速播放视频适用B站 慕课MOOC 百度网盘(弃用) 谷歌内置播放器最高16倍速

    方法一 代码 1 百度网盘 已失效 videojs getPlayers video player html5player tech setPlaybackRate 2 0 2 B站 MOOC慕课 通用 document querySele
  • emacs evil-matchit实现verilog配对的代码跳转

    背景 emacs插件evil matchit 参考文档 背景 vim里常使用 进行跳转 遇到代码段较长的情况 跳转方便而且有助于debug vim 实现begin end 配对 使用matchit插件 岁月长河 博客园 http www c
  • C++ OpenSSL 3.0.8 AES加解密

    2023年后 openssl进入3 0版本 openssl的加解密代码也出现了一些变化 例如编译时会有如下错误 error C4996 AES set encrypt key Since OpenSSL 3 0 如果使用OpenSSL 1
  • 算法:图解递归算法的应用场景和使用途径

    文章目录 什么是递归 使用递归的原因 如何理解递归 递归的使用写法 典型例题和分析 汉诺塔问题 合并两个有序链表 反转链表 两两交换链表中的节点 pow 总结 什么是递归 递归就是函数自己调用自己的情况 在二叉树 快排 归并中都有较为广泛的
  • LeetCode题目笔记——1604. 警告一小时内使用相同员工卡大于等于三次的人

    文章目录 题目描述 题目难度 中等 方法一 排序 哈希表 代码 Python 代码 C 总结 题目描述 力扣公司的员工都使用员工卡来开办公室的门 每当一个员工使用一次他的员工卡 安保系统会记录下员工的名字和使用时间 如果一个员工在一小时时间