Problem
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.
Examples
Example 1:
|
|
Example 2:
|
|
Constraints:
1 <= keyName.length, keyTime.length <= 105
keyName.length == keyTime.length
keyTime[i]
is in the format " HH:MM".[keyName[i], keyTime[i]]
is unique.1 <= keyName[i].length <= 10
keyName[i] contains only lowercase English letters.
Solution
Method 1 – Sorting and Sliding Window
Intuition
If we sort each person’s keycard usage times, we can efficiently check for any three usages within a one-hour window by sliding through their sorted times. If such a window exists, that person should be alerted.
Approach
-
Group by Name: Build a mapping from each name to a list of their keycard usage times.
-
Convert Times: Convert each time from “HH:MM” format to minutes since midnight for easy comparison.
-
Sort Times: For each person, sort their list of times.
-
Sliding Window: For each person, check every window of three consecutive times. If the difference between the first and third time in the window is 60 minutes or less, add the name to the answer.
-
Sort Result: Return the list of alerted names in alphabetical order.
Code
|
|
|
|
|
|
|
|
Complexity
-
⏰ Time complexity:
O(N log N)
- Grouping and converting times: O(N)
- Sorting times for each user: O(N log N) in total
- Sliding window check: O(N)
- Sorting answer: O(K log K), K = number of unique names
-
🧺 Space complexity:
O(N)
- For storing all times per user and the answer list.