729. My Calendar I

来源:互联网 发布:手机淘宝2017历史版本 编辑:程序博客网 时间:2024/04/30 06:44

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.

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 trueMyCalendar.book(15, 25); // returns falseMyCalendar.book(20, 30); // returns trueExplanation: 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].


    设计一个MyCalendar类,要求包含一个类方法book,用于预约时间段,要求预约时间段不能重叠。这里使用map辅助实现。参数为时间段的开头start和结尾end,若没有重叠分别保存到map的键和值中。对于判断重叠,用lower_bound(start)搜出开头刚好大于或等于start的时间段,如果是等于,肯定是重叠的,所以返回false;如果是大于且开头小于end,说明出现重叠,也返回false。同样地,对前一个时间段通过结尾和end的大小关系判断重叠。实现代码如下:


    代码:

    class MyCalendar {public:    MyCalendar() {        times[-1] = -1;        times[1000000001] = 1000000001;    }        bool book(int start, int end) {        auto iter = times.lower_bound(start);        if(iter->first == start) return false;        if(iter->first < end) {            return false;        }        iter = prev(iter);        if(iter->second > start) {            return false;        }        times[start] = end;        return true;    }private:    map<long long, long long> times;};