题目描述:
实现一个 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)