题目描述:
实现一个 MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ,则可以存储这个新的日程安排。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。
日程可以用一对整数 startTime 和 endTime 表示,这里的时间是半开区间,即 [startTime, endTime), 实数 x 的范围为, startTime <= x < endTime 。
实现 MyCalendar 类:
MyCalendar()初始化日历对象。boolean book(int startTime, int endTime)如果可以将日程安排成功添加到日历中而不会导致重复预订,返回true。否则,返回false并且不要将该日程安排添加到日历中。
代码思路:
类定义和初始化
-
类定义:
class MyCalendar:定义了一个名为MyCalendar的类。 -
初始化方法
__init__(self):- 创建一个名为
temp的集合(set)。这个集合用来存储已经预定的时间段的元组,每个元组包含两个元素:开始时间和结束时间,即(start, end)。 - 使用集合是因为集合提供了快速的成员检查和添加操作,这对于判断新的预定是否与已有预定重叠非常有用。
- 创建一个名为
预定方法
- 预定方法
book(self, start: int, end: int) -> bool:- 这个方法接受两个参数:
start(预定的开始时间)和end(预定的结束时间)。 - 定义一个名为
judge的布尔变量,初始化为True,用于标记新的预定是否与已有预定重叠。
- 这个方法接受两个参数:
- 遍历已有预定:
- 使用一个for循环遍历
temp集合中的每个预定(i_start, i_end)。 - 对于每个已存在的预定,检查新的预定是否与其重叠。重叠的条件是:新的预定的开始时间
start小于已有预定的结束时间i_end,且新的预定的结束时间end大于已有预定的开始时间i_start。 - 如果新的预定不与当前遍历的预定重叠,则继续遍历(使用
continue)。 - 如果发现重叠,则将
judge设置为False并跳出循环。
- 使用一个for循环遍历
- 添加新的预定或返回结果:
- 如果
judge保持为True(即没有重叠),则将新的预定(start, end)添加到temp集合中,并返回True表示预定成功。 - 如果
judge变为False(即存在重叠),则直接返回False表示预定失败。
- 如果
使用示例
- 创建一个
MyCalendar对象:obj = MyCalendar() - 使用
book方法预定时间段:param_1 = obj.book(start, end)- 如果返回
True,表示预定成功。 - 如果返回
False,表示预定失败,因为与已有预定重叠。
- 如果返回
代码实现:
class MyCalendar:def __init__(self):# 哈希set存储目标值self.temp = set()def book(self, start: int, end: int) -> bool:judge = True# 判断是否符合条件for i in self.temp:if start >= i[1] or end <= i[0]:continueelse:judge = Falsebreakif judge:self.temp.add((start, end))return Trueelse:return False# Your MyCalendar object will be instantiated and called as such:
# obj = MyCalendar()
# param_1 = obj.book(start,end)
