题目难度: 中等
今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复
剑指offer2
就能看到该系列当前连载的所有文章了, 记得关注哦~
请实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。
MyCalendar 有一个 book(int start, int end)方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。
每次调用 MyCalendar.book 方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。
请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)
[calendars[i-1], cur, calendars[i]]
, 也即新区间的左右邻居就是下标 i-1 和 ifrom sortedcontainers import SortedList
class MyCalendar:
def __init__(self):
self.calendars = SortedList()
def hasIntersect(self, range1, range2):
# 判断两个区间是否有重叠
s1, e1 = range1
s2, e2 = range2
return not (s2 >= e1 or s1 >= e2)
def book(self, start: int, end: int) -> bool:
# 二分查找当前区间应该插入的位置
i = self.calendars.bisect_left([start, end])
for j in (i - 1, i):
# 只需要判断当前区间cur的左右两个相邻区间, 即[calendars[i-1], cur, calendars[i]]
if 0 <= j < len(self.calendars) and self.hasIntersect(self.calendars[j], [start, end]):
return False
self.calendars.add([start, end])
return True
大家可以在下面这些地方找到我~😊
我的公众号: 算法精选, 欢迎大家扫码关注~😊