old_contents: """Leetcode 729. My Calendar I
  Medium
  
  URL: https://leetcode.com/problems/my-calendar-i/
  
  Implement a MyCalendar class to store your events. A new event can be added if adding
  the event will not cause a double booking.
  
  Your class will have the 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 double booking happens when two events have some non-empty intersection (ie., there
  is some time that is common to both events.)
  
  For each call to the method MyCalendar.book, return true if the event can be added to
  the calendar successfully without causing a double 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 1:
  MyCalendar();
  MyCalendar.book(10, 20); // returns true
  MyCalendar.book(15, 25); // returns false
  MyCalendar.book(20, 30); // returns true
  Explanation: 
  The first event can be booked.  The second can't because time 15 is already booked by
  another event.
  The third event can be booked, as the first event takes every time less than 20,
  but not including 20.
   
  Note:
  - The number of calls to MyCalendar.book per test case will be at most 1000.
  - In calls to MyCalendar.book(start, end), start and end are integers in the range [0, 10^9].
  
  Your MyCalendar object will be instantiated and called as such:
  obj = MyCalendar()
  param_1 = obj.book(start,end)
  """
  
  class MyCalendar(object):
      def __init__(self):
          pass
  
      def book(self, start, end):
          """
          :type start: int
          :type end: int
          :rtype: bool
          """
          pass
  
  
  def main():
      pass
  
  
  if __name__ == '__main__':
      main()
  
new_contents: """Leetcode 729. My Calendar I
  Medium
  
  URL: https://leetcode.com/problems/my-calendar-i/
  
  Implement a MyCalendar class to store your events. A new event can be added if adding
  the event will not cause a double booking.
  
  Your class will have the 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 double booking happens when two events have some non-empty intersection (ie., there
  is some time that is common to both events.)
  
  For each call to the method MyCalendar.book, return true if the event can be added to
  the calendar successfully without causing a double 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 1:
  MyCalendar();
  MyCalendar.book(10, 20); // returns true
  MyCalendar.book(15, 25); // returns false
  MyCalendar.book(20, 30); // returns true
  Explanation: 
  The first event can be booked.  The second can't because time 15 is already booked by
  another event.
  The third event can be booked, as the first event takes every time less than 20,
  but not including 20.
   
  Note:
  - The number of calls to MyCalendar.book per test case will be at most 1000.
  - In calls to MyCalendar.book(start, end), start and end are integers in the range [0, 10^9].
  
  Your MyCalendar object will be instantiated and called as such:
  obj = MyCalendar()
  param_1 = obj.book(start,end)
  """
  
  class MyCalendarListIter(object):
      def __init__(self):
          self.books = []
  
      def book(self, start, end):
          """
          :type start: int
          :type end: int
          :rtype: bool
  
          Time complexity: O(n).
          Space complexity: O(n).
          """
          # Iteratively check all books overlapping with [start, end].
          for book in self.books:
              if max(book[0], start) < min(book[1], end):
                  return False
  
          # If no overlaps, add to books.
          self.books.append([start, end])
          return True
  
  
  def main():
      # MyCalendar.book(10, 20); // returns true
      # MyCalendar.book(15, 25); // returns false
      # MyCalendar.book(20, 30); // returns true
      calendar = MyCalendarListIter()
      print calendar.book(10, 20)
      print calendar.book(15, 25)
      print calendar.book(20, 30)
  
  
  if __name__ == '__main__':
      main()
  
subject: Complete list iter sol