警告一小时内使用相同员工卡大于等于三次的人【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
andkeyTime
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 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)
- 复杂度