732. My Calendar III
Description
A k
-booking happens when k
events have some non-empty intersection (i.e., there is some time that is common to all k
events.)
You are given some events [startTime, endTime)
, after each given event, return an integer k
representing the maximum k
-booking between all the previous events.
Implement the MyCalendarThree
class:
MyCalendarThree()
Initializes the object.int book(int startTime, int endTime)
Returns an integerk
representing the largest integer such that there exists ak
-booking in the calendar.
Example 1:
Input ["MyCalendarThree", "book", "book", "book", "book", "book", "book"] [[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]] Output [null, 1, 1, 2, 3, 3, 3] Explanation MyCalendarThree myCalendarThree = new MyCalendarThree(); myCalendarThree.book(10, 20); // return 1 myCalendarThree.book(50, 60); // return 1 myCalendarThree.book(10, 40); // return 2 myCalendarThree.book(5, 15); // return 3 myCalendarThree.book(5, 10); // return 3 myCalendarThree.book(25, 55); // return 3
Constraints:
0 <= startTime < endTime <= 109
- At most
400
calls will be made tobook
.
Solution
my-calendar-iii.py
class LazySegmentTree:
def __init__(self, low, high, val):
self.low = low
self.high = high
self.val = val
self.lazy = 0
self.left = None
self.right = None
def _extend(self):
if self.low < self.high:
if self.left is None:
mid = (self.low + self.high) // 2
self.left = LazySegmentTree(self.low, mid, self.val)
if mid + 1 <= self.high:
self.right = LazySegmentTree(mid + 1, self.high, self.val)
elif self.lazy != 0:
self.left.val += self.lazy
self.left.lazy += self.lazy
self.right.val += self.lazy
self.right.lazy += self.lazy
self.lazy = 0
def update(self, low, high, delta):
if low > high or self.high < low or high < self.low:
return
if low <= self.low and self.high <= high:
self.val += delta
self.lazy += delta
return
self._extend()
self.left.update(low, high, delta)
self.right.update(low, high, delta)
self.val = max(self.left.val, self.right.val)
def query(self, low, high):
if low > high or self.high < low or high < self.low:
return 0
if low <= self.low and self.high <= high:
return self.val
self._extend()
return max(self.left.query(low, high), self.right.query(low, high))
class MyCalendarThree:
def __init__(self):
self.st = LazySegmentTree(0, 10 ** 9, 0)
def book(self, start: int, end: int) -> int:
self.st.update(start, end - 1, 1)
return self.st.query(0, 10 ** 9)
# Your MyCalendarThree object will be instantiated and called as such:
# obj = MyCalendarThree()
# param_1 = obj.book(start,end)