1604. Alert Using Same Key Card Three or More Times in a One Hour Period - cocoder39/coco39_LC GitHub Wiki

1604. Alert Using Same Key-Card Three or More Times in a One Hour Period

class Solution:
    def alertNames(self, keyName: List[str], keyTime: List[str]) -> List[str]:
        n = len(keyName)
        name_to_times = collections.defaultdict(list)
        for i in range(n):
            name_to_times[keyName[i]].append(keyTime[i])
        
        res = []
        for name, times in name_to_times.items():
            times.sort()
            deque = collections.deque()
            for time in times:
                while deque and not self.isWithinHour(deque[0], time):
                    deque.popleft()
                deque.append(time)
                if len(deque) >= 3:
                    res.append(name)
                    break
        
        res.sort()
        return res

    def isWithinHour(self, time1, time2):
        hour1, min1 = time1.split(':')
        hour1, min1 = int(hour1), int(min1)
        hour2, min2 = time2.split(':')
        hour2, min2 = int(hour2), int(min2)
        diff = (hour2 - hour1) * 60 + (min2 - min1)
        return diff <= 60