当 k
个日程安排有一些时间上的交叉时(例如 k
个日程安排都在同一时间内),就会产生 k
次预订。
给你一些日程安排 [start, end)
,请你在每个日程安排添加后,返回一个整数 k
,表示所有先前日程安排会产生的最大 k
次预订。
实现一个 MyCalendarThree
类来存放你的日程安排,你可以一直添加新的日程安排。
MyCalendarThree()
初始化对象。int book(int start, int end)
返回一个整数k
,表示日历中存在的k
次预订的最大值。
示例:
输入: ["MyCalendarThree", "book", "book", "book", "book", "book", "book"] [[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]] 输出: [null, 1, 1, 2, 3, 3, 3] 解释: MyCalendarThree myCalendarThree = new MyCalendarThree(); myCalendarThree.book(10, 20); // 返回 1 ,第一个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。 myCalendarThree.book(50, 60); // 返回 1 ,第二个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。 myCalendarThree.book(10, 40); // 返回 2 ,第三个日程安排 [10, 40) 与第一个日程安排相交,所以最大 k 次预订是 2 次预订。 myCalendarThree.book(5, 15); // 返回 3 ,剩下的日程安排的最大 k 次预订是 3 次预订。 myCalendarThree.book(5, 10); // 返回 3 myCalendarThree.book(25, 55); // 返回 3
提示:
0 <= start < end <= 109
- 每个测试用例,调用
book
函数最多不超过400
次
from sortedcontainers import SortedDict # 导入SortedDict,用于存储排序后的键值对
class MyCalendarThree:
def __init__(self):
# 初始化方法,创建一个SortedDict实例来存储预订信息
# 键为时间点(开始或结束),值为该时间点的预订变化量(开始为+1,结束为-1)
self.d = SortedDict()
def book(self, start: int, end: int) -> int:
# 预订方法,接受开始时间和结束时间作为参数,返回最大重叠预订数
# 在开始时间对应的键上增加1,表示一个新的预订开始
# 如果该键已存在,则在其原有值的基础上加1
self.d[start] = self.d.setdefault(start, 0) + 1
# 在结束时间对应的键上减少1,表示一个预订结束
# 如果该键已存在,则在其原有值的基础上减1
# 如果该键不存在,则设置其值为-1(表示一个结束事件)
self.d[end] = self.d.setdefault(end, 0) - 1
# 初始化变量来记录当前的最大重叠预订数和当前的预订数
ans = maxBook = 0
# 遍历SortedDict中的所有值(即预订变化量)
for freq in self.d.values():
# 更新当前的预订数(累加预订变化量)
maxBook += freq
# 更新最大重叠预订数(取当前预订数和最大重叠预订数的较大值)
ans = max(ans, maxBook)
# 返回最大重叠预订数
return ans
力扣官网解决代码,自己在学习过程中的注释版,仅作个人学习记录。