警告一小时内使用相同员工卡大于等于三次的人【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
keyNameandkeyTimewhere[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 i i,判断其与第 i − 1 i-1 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(nlogn) O(nlogn)
- 空间复杂度: O ( n ) O(n) O(n)
- 复杂度

给定员工姓名和使用工卡的时间戳列表,该程序旨在找出在一小时内使用工卡三次或更多次的员工,并按字母顺序返回他们的名字。通过使用哈希表存储每个员工的时间戳并进行排序,然后用双指针滑动窗口方法检查60分钟内的使用次数来实现这一目标。

被折叠的 条评论
为什么被折叠?



