My Calendar 3
Problem
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 [start, end), 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 start, int end)Returns an integerkrepresenting the largest integer such that there exists ak-booking in the calendar.
Examples
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, The first event can be booked and is disjoint, so the maximum k-booking is a 1-booking.
myCalendarThree.book(50, 60); // return 1, The second event can be booked and is disjoint, so the maximum k-booking is a 1-booking.
myCalendarThree.book(10, 40); // return 2, The third event [10, 40) intersects the first event, and the maximum k-booking is a 2-booking.
myCalendarThree.book(5, 15); // return 3, The remaining events cause the maximum K-booking to be only a 3-booking.
myCalendarThree.book(5, 10); // return 3
myCalendarThree.book(25, 55); // return 3
Solution
Method 1 - Using TreeMap and Count
To solve this problem, we need to find the maximum number of overlapping intervals (or bookings). The key idea is to use a difference array to track start and end points of intervals and apply an interval sweep technique to calculate the maximum overlap.
We use a TreeMap (Java) or dict (Python) to record the times when intervals start (+1) and end (-1). This allows us to efficiently count overlapping intervals.
We can use solution similar to [My Calendar 2#Method 1 - Using TreeMap and Count](my-calendar-2.md/#method-1---using-treemap-and-count).Instead of checking for 2, we check for k-1.
Algorithm
- Every time an interval
[start, end)is added, we update the map by incrementing the start time by1(indicating an interval starts) and decrementing the end time by-1(indicating an interval ends). - To calculate the maximum overlap (
k-booking), traverse through the keys of this map in sorted order and maintain a running sum of active intervals. Update the maximum overlap as the running sum evolves.
Code
Java
class MyCalendarThree {
private TreeMap<Integer, Integer> countMap;
public MyCalendarThree() {
countMap = new TreeMap<>();
ans = 0;
}
public int book(int start, int end) {
countMap.put(start, countMap.getOrDefault(start, 0) + 1);
countMap.put(end, countMap.getOrDefault(end, 0) - 1);
int ans = 0;
int active = 0;
for (int c : countMap.values()) {
active += c;
ans = Math.max(ans, active);
}
return ans;
}
}
Python
class MyCalendarThree:
def __init__(self) -> None:
self.count_map: Dict[int, int] = {}
def book(self, start: int, end: int) -> int:
self.count_map[start] = self.count_map.get(start, 0) + 1
self.count_map[end] = self.count_map.get(end, 0) - 1
ans: int = 0
active: int = 0
for t in sorted(self.count_map):
active += self.count_map[t]
ans = max(self.ans, active)
return ans
Complexity
- ⏰ Time complexity:
O(n). Thebookmethod involves updating the map which takesO(log(n))due to insertion in a sorted map and a sweep over the keys which takesO(n)in the worst case.- Hence, the time complexity of
bookisO(n)per call.
- Hence, the time complexity of
- 🧺 Space complexity:
O(n)for storing the map, wherenis the number of unique time points.