[LeetCode 732] My Calendar III

    xiaoxiao2024-12-01  84

    Implement a MyCalendarThree class to store your events. A new event can alwaysbe added.

    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 K-booking happens when K events have some non-empty intersection (ie., there is some time that is common to all K events.)

    For each call to the method MyCalendar.book, return an integer K representing the largest integer such that there exists a K-booking in the calendar.

    Your class will be called like this: MyCalendarThree cal = new MyCalendarThree();MyCalendarThree.book(start, end)

    Example 1:

    MyCalendarThree(); MyCalendarThree.book(10, 20); // returns 1 MyCalendarThree.book(50, 60); // returns 1 MyCalendarThree.book(10, 40); // returns 2 MyCalendarThree.book(5, 15); // returns 3 MyCalendarThree.book(5, 10); // returns 3 MyCalendarThree.book(25, 55); // returns 3 Explanation: The first two events can be booked and are disjoint, so the maximum K-booking is a 1-booking. The third event [10, 40) intersects the first event, and the maximum K-booking is a 2-booking. The remaining events cause the maximum K-booking to be only a 3-booking. Note that the last event locally causes a 2-booking, but the answer is still 3 because eg. [10, 20), [10, 40), and [5, 15) are still triple booked.

    Note:

    The number of calls to MyCalendarThree.book per test case will be at most 400.In calls to MyCalendarThree.book(start, end), start and end are integers in the range [0, 10^9].

    分析

    与之前的 My Calendar 和  My Calendar II不同,这道题要求给出当前Calendar 中最大的重复次数。这道题如果不知道使用map的巧妙解法,写起来会相当费劲。使用map<int, int>来记录当前的时间段,只不过每次插入[start, end)时,map[start] ++, map[end] --,之后从小打到遍历key,计算value的和,value的和的最大值就代表了重复时间段的最多次数。

    举例说明:[5, 15), [10, 20), [10, 18)

    {5, 1}, {15, -1}

    {5, 1}, {10, 1}, {15, -1}, {20, -1}

    {5, 1}, {10, 2}, {15, -1}, {18, -1}, {20, -1}

    那么计算出value的和最大值为3。

    Code

    class MyCalendarThree { public: MyCalendarThree() { } int book(int start, int end) { if (m.find(start) == m.end()) m[start] = 0; if (m.find(end) == m.end()) m[end] = 0; m[start] ++; m[end] --; map<int, int>::iterator iter; int count = 0; int res = 0; for (iter = m.begin(); iter!= m.end(); iter ++) { count += iter->second; res = max(res, count); } return res; } map<int, int> m; };

    运行效率

    Runtime: 144 ms, faster than 33.22% of C++ online submissions for My Calendar III.

    Memory Usage: 25.1 MB, less than 72.05% of C++ online submissions for My Calendar III.

    最新回复(0)