题目描述:
实现一个程序来存放你的日程安排。如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排。
当三个日程安排有一些时间上的交叉时(例如三个日程安排都在同一时间内),就会产生 三重预订。
事件能够用一对整数 startTime
和 endTime
表示,在一个半开区间的时间 [startTime, endTime)
上预定。实数 x
的范围为 startTime <= x < endTime
。
实现 MyCalendarTwo
类:
MyCalendarTwo()
初始化日历对象。boolean book(int startTime, int endTime)
如果可以将日程安排成功添加到日历中而不会导致三重预订,返回true
。否则,返回false
并且不要将该日程安排添加到日历中。
代码思路:
成员变量:
self.bookings
:一个列表,用于记录所有已成功预订的时间段。每个预订都以一个包含开始时间和结束时间的元组形式存在。self.overlaps
:一个列表,用于追踪所有检测到的双重重叠时间段。这些时间段是先前已接受的预订之间产生的重叠部分。
方法:book(startTime: int, endTime: int) -> bool
此方法用于尝试预订一个新的时间段,并返回一个布尔值来指示预订是否成功。
步骤解析:
- 三重重叠检查:
- 遍历
self.overlaps
列表,检查新的预订时间段是否与列表中的任何一个双重重叠时间段重叠。 - 若重叠(即新的预订时间段与某个双重重叠时间段存在交集),则意味着添加此预订将导致三重重叠,因此方法返回
False
。
- 遍历
- 更新双重重叠列表:
- 若新的预订未导致三重重叠,则继续遍历
self.bookings
列表,检查新的预订时间段是否与列表中的任何一个已接受预订重叠。 - 若重叠,则计算重叠部分(即新的预订时间段与已接受预订时间段的交集),并将该双重重叠时间段添加到
self.overlaps
列表中。
- 若新的预订未导致三重重叠,则继续遍历
- 预订添加:
- 将新的预订时间段添加到
self.bookings
列表中。 - 返回
True
,表示预订已成功添加。
- 将新的预订时间段添加到
代码实现:
class MyCalendarTwo:def __init__(self):self.bookings = []self.overlaps = []def book(self, startTime: int, endTime: int) -> bool:# 检查是否会导致三重预订for overlap_start, overlap_end in self.overlaps:if max(startTime, overlap_start) < min(endTime, overlap_end):return False# 更新 overlaps 列表for booked_start, booked_end in self.bookings:if max(startTime, booked_start) < min(endTime, booked_end):self.overlaps.append((max(startTime, booked_start), min(endTime, booked_end)))# 添加到 bookings 列表self.bookings.append((startTime, endTime))return True# Your MyCalendarTwo object will be instantiated and called as such:
# obj = MyCalendarTwo()
# param_1 = obj.book(startTime,endTime)