[leetcode] 729. My Calendar I @ python

版权声明:版权归个人所有,未经博主允许,禁止转载 https://blog.csdn.net/danspace1/article/details/88769952

原题

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].

解法1

构造列表, 遍历列表, 检查start, end是否为有效的, 有效预定的条件是: start <= interval.end 或者 end >= interval.start. 如果某个interval不符合条件, 则返回False.

代码

class MyCalendar(object):

    def __init__(self):
        self.data = []

    def book(self, start, end):
        """
        :type start: int
        :type end: int
        :rtype: bool
        """
        if not self.data:
            self.data.append([start, end])
            return True
        for interval in self.data:
            if start >= interval[1] or end <= interval[0]:
                continue
            else:
                return False
        self.data.append([start, end])
        return True

解法2

二分搜索法. 使用bisect.bisect_left找到应该插入的index, 检查start, end是否有效. 两者必须同时有效才能插入新的预约, 否则返回False.

代码

class MyCalendar(object):

    def __init__(self):
        self.data = []

    def book(self, start, end):
        """
        :type start: int
        :type end: int
        :rtype: bool
        """
        index = bisect.bisect_left(self.data, (start, end))
        # check if the start and the end are valid
        start_valid = (index == 0 or start >= self.data[index-1][1])
        end_valid = (index == len(self.data) or end <= self.data[index][0])
        
        if start_valid and end_valid:
            self.data.insert(index, (start, end))
            return True
        return False

猜你喜欢

转载自blog.csdn.net/danspace1/article/details/88769952