问题描述:
- 请实现一个
MyCalendar 类来存放日程安排。
- 如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。
MyCalendar 有一个 book(int start, int end) 方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end)。- 当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。
- 每次调用
MyCalendar.book 方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订则返回 true,否则返回 false 并且不要将该日程安排添加到日历中。
核心思路:
- 该题和剑指 offer Ⅱ 057 值和下标之差都在给定的范围内的解题思路差不多,都是有序集合 + 二分搜索。
- 具体来说,插入一个区间为
[start, end),所以可以先对有序集合进行二分搜索(即调用 lower_bound)找到 [end, 0) 的第一个更大区间,此时判断该更大区间的前一个区间是否和 [start, end) 有重合即可。 - 如果没有重合则将新区间插入到有序集合中。
代码实现:
class MyCalendar
{
private:
set<pair<int, int>> ss;
public:
MyCalendar() {}
bool book(int start, int end)
{
auto iter = ss.lower_bound({end, 0});
bool ans = false;
if(iter == ss.begin() or (--iter)->second <= start)
{
ss.emplace(start, end);
ans = true;
}
return ans;
}
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19