732 我的日程安排表 III(差分思想)
1. 問題描述:
當 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 <= 10 ^ 9
每個測試用例,調用 book?函數最多不超過?400次
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/my-calendar-iii
2. 思路分析:
分析題目可以知道這道題目類似于力扣的699題,因為涉及到區(qū)間修改與區(qū)間查詢操作,所以可以使用帶有懶標記的線段樹進行求解(區(qū)間所有元素整體加1),但是帶有懶標記的線段樹比較復雜而且耗時比較大(c++不容易超時但是java等語言很容易超時),因為涉及到區(qū)間整體加1(差分可以解決區(qū)間整體加上某個數的題目)所以我們可以借助于差分的思想,每一次添加一個區(qū)間的時候可以使用一個數據結構來維護區(qū)間的左端點加1,右端點減1,因為在插入區(qū)間的時候需要維護區(qū)間的有序性,c++可以使用map來維護,python可以使用sortedcontainers.SortedDict()來維護,這樣我們在插入元素的時候就可以維護插入當前區(qū)間之后還是有序的。
3. 代碼如下:
python(使用排序容器SortedDict來維持插入的元素是有序的):
import sortedcontainersclass MyCalendarThree:def __init__(self):# 維護插入的區(qū)間是有序的self.S = sortedcontainers.SortedDict() # 差分def book(self, start: int, end: int) -> int:if start not in self.S:self.S[start] = 0self.S[start] += 1if end not in self.S:self.S[end] = 0self.S[end] -= 1res = 0s = 0for k, v in self.S.items():s += vres = max(res, s)return res總結
以上是生活随笔為你收集整理的732 我的日程安排表 III(差分思想)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转云服务器,怎样用云服务器架设搭建游戏
- 下一篇: 安卓桌面软件哪个好_每日提醒软件哪个好?