LeetCode – My Calendar II (Java)

Implement a MyCalendarTwo class to store your events. A new event can be added if adding the event will not cause a triple booking.

Your class will have one method, book(int start, int end). Formally, this represents a booking on the half open interval [start, end), the range of real numbers x such that start <= x < end. A triple booking happens when three events have some non-empty intersection (ie., there is some time that is common to all 3 events.) For each call to the method MyCalendar.book, return true if the event can be added to the calendar successfully without causing a triple booking. Otherwise, return false and do not add the event to the calendar. Your class will be called like this: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)

Example:

MyCalendar();
MyCalendar.book(10, 20); // returns true
MyCalendar.book(50, 60); // returns true
MyCalendar.book(10, 40); // returns true
MyCalendar.book(5, 15); // returns false
MyCalendar.book(5, 10); // returns true
MyCalendar.book(25, 55); // returns true

Java Solution

This is a more complicated version of My Calendar I, in which we only care if a time interval is used already. For this problem, we can add another list to track the double booked intervals.

class MyCalendarTwo {
    ArrayList<int[]> single = null;
    ArrayList<int[]> overlap = null;
 
    public MyCalendarTwo() {
        single = new ArrayList<>();
        overlap = new ArrayList<>();
    }
 
    public boolean book(int start, int end) {
        for (int[] itv : overlap) {
            if (end > itv[0] && start < itv[1]) {
                return false;
            }
        }
 
        for (int[] itv : single) {
            if (end > itv[0] && start < itv[1]) {
                overlap.add(new int[]{Math.max(itv[0], start), Math.min(itv[1], end)});
            }
        }
 
        single.add(new int[]{start, end});
 
        return true;
    }
}

Time complexity is O(N^2) as each book operation iterate over all existing intervals. Space complexity is O(N).

Category >> Algorithms  
If you want someone to read your code, please put the code inside <pre><code> and </code></pre> tags. For example:
<pre><code> 
String foo = "bar";
</code></pre>