【每日一题Day111】LC1604警告一小时内使用相同员工卡大于等于三次的人 | 哈希表+排序

简介: 使用哈希表统计每位员工使用工卡的所有时间节点,将时间转化为分钟的形式,方便后续统计一小时内使用次数大于等于3的员工

警告一小时内使用相同员工卡大于等于三次的人【LC1604】


LeetCode company workers use key-cards to unlock office doors. Each time a worker uses their key-card, the security system saves the worker’s name and the time when it was used. The system emits an alert if any worker uses the key-card three or more times in a one-hour period.


You are given a list of strings keyName and keyTime where [keyName[i], keyTime[i]] corresponds to a person’s name and the time when their key-card was used in a single day.


Access times are given in the 24-hour time format “HH:MM”, such as "23:51" and "09:49".


Return a list of unique worker names who received an alert for frequent keycard use. Sort the names in ascending order alphabetically.


Notice that "10:00" - "11:00" is considered to be within a one-hour period, while "22:51" - "23:52" is not considered to be within a one-hour period.


2023/2/7


  • 思路:


。使用哈希表统计每位员工使用工卡的所有时间节点,将时间转化为分钟的形式,方便后续统计一小时内使用次数大于等于3的员工


。然后将每位员工的时间节点从小到大排序,如果在60分钟的间隔内,有大于等于3个时间节点,那么需要对该员工发出警告


  • 双指针滑动窗口统计
  • 枚举每一个时间节点i ii,判断其与第i−1个时间节点的差值是否小于等于60


。返回结果需要按照字典顺序排序


  • 实现


class Solution {
    public List<String> alertNames(String[] keyName, String[] keyTime) {
        Map<String,List<Integer>> map = new HashMap<>();;
        List<String> res = new LinkedList<>();
        int n = keyName.length;        
        for (int i = 0; i < n; i++){
            String name = keyName[i];
            String[] times = keyTime[i].split(":");
            int hour = Integer.parseInt(times[0]);
            int m = Integer.parseInt(times[1]);
            int t = hour * 60 + m;
            List<Integer> list = map.getOrDefault(name, new ArrayList<>());
            list.add(t);
            map.put(name, list);
        }
        for (var node : map.entrySet()){
            String name = node.getKey();
            List<Integer> times = node.getValue();
            int size = times.size();            
            Collections.sort(times);
            // 滑动窗口
            // if (size < 3) continue;
            // int l = 0, r = 0;
            // while (l < size && r < size){
            //     while (r < size && times.get(r) - times.get(l) <= 60 ){
            //         r++;
            //     } 
            //     if (r - l >= 3){
            //         res.add(name);
            //         break;
            //     }
            //     while (l < size && r < size && times.get(r) - times.get(l) > 60){
            //         l++;
            //     } 
            // }
            // 枚举
            for (int i = 2; i < size; i++){
                if (times.get(i) - times.get(i - 2) <= 60){
                    res.add(name);
                    break;
                }
            }
        }
        Collections.sort(res);
        return res;
    }
}


。复杂度


  • 时间复杂度:O ( n l o g n )
  • 空间复杂度:O ( n )
目录
相关文章
|
机器学习/深度学习
【每日一题Day84】LC2283判断一个数的数字计数是否等于数位的值 | 哈希表
思路:使用哈希表统计每个数字出现的次数,再与字符串中的次数进行比较,如果所有数字次数均等于字符串中的次数,返回true;反之,返回false
76 0
【每日一题DAY21】LC1684统计一致字符串的数目|哈希表
给你一个由不同字符组成的字符串 allowed 和一个字符串数组 words 。如果一个字符串的每一个字符都在 allowed 中,就称这个字符串是 一致字符串 。
88 0
【每日一题Day93】LC1817查找用户活跃分钟数 | 哈希表
思路:使用哈希表记录每个用户的活跃时间,那么用户活跃分钟数则为活跃时间的多少,因此哈希表的key值为用户id,value值为Set集合
91 0
|
10月前
【每日一题Day197】LC2432处理用时最长的那个任务的员工 | 枚举
【每日一题Day197】LC2432处理用时最长的那个任务的员工 | 枚举
58 0
|
10月前
【每日一题Day278】LC2500删除每行中的最大值 | 排序+模拟
【每日一题Day278】LC2500删除每行中的最大值 | 排序+模拟
62 0
|
10月前
【每日一题Day227】LC2465不同的平均值数目 | 排序 + 哈希表
【每日一题Day227】LC2465不同的平均值数目 | 排序 + 哈希表
34 0
|
10月前
【每日一题Day269】LC1851包含每个查询的最小区间 | 排序+离线查询+小顶堆
【每日一题Day269】LC1851包含每个查询的最小区间 | 排序+离线查询+小顶堆
60 0
|
9月前
1087 有多少不同的值 (20 分)
1087 有多少不同的值 (20 分)
7-211 求前缀表达式的值 (25 分)
7-211 求前缀表达式的值 (25 分)
245 0
|
10月前
【每日一题Day118】LC1124表现良好的最长时间段 | 前缀和+单调栈/哈希表
【每日一题Day118】LC1124表现良好的最长时间段 | 前缀和+单调栈/哈希表
65 0