题目描述:
实现一个 MyCalendar 类来存放你的日程安排。如果要添加的时间内没有其他安排,则可以存储这个新的日程安排。
MyCalendar 有一个 book(int start, int end)方法。它意味着在 start 到 end 时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生重复预订。
每次调用 MyCalendar.book方法时,如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true。否则,返回 false 并且不要将该日程安排添加到日历中。
请按照以下步骤调用 MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)
示例 1:
MyCalendar();
MyCalendar.book(10, 20); // returns true
MyCalendar.book(15, 25); // returns false
MyCalendar.book(20, 30); // returns true
解释:
第一个日程安排可以添加到日历中. 第二个日程安排不能添加到日历中,因为时间 15 已经被第一个日程安排预定了。
第三个日程安排可以添加到日历中,因为第一个日程安排并不包含时间 20 。
说明:
每个测试用例,调用 MyCalendar.book 函数最多不超过 100次。
调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]。
方法1:
主要思路:解题汇总链接
(1)将每个日程使用map存储,键存储日程的开始时间,值存储日程的终止时间;
(2)当有新的日程时,先需要判断是否和已有日程有重叠,直接对map进行遍历(map已经按照各个日程的起始时间进行了排序),比较新日程的终止时间小于等于当前日程的起始时间,若满足要求,说明可以在该位置插入新的日程,直接返回true;若新的日程的起始时间小于当前日程的终止时间,说明有重叠时间,直接返回false;否则接着遍历下一个已有的日程;
(3)若遍历完了所有的日程,则说明当前新的日程的起始时间已经大于之前的所有已有日程的终止时间,故直接插入新的日程,返回true;
class MyCalendar {
public:
map<int,int> mp;
MyCalendar() {
}
bool book(int start, int end) {
for(auto it=mp.begin();it!=mp.end();++it){//遍历所有的已有日程
if(end<=it->first){//说明可以插入新的日程
mp[start]=end;
return true;
}
else if(start<it->second){//说明和当前日程有重叠
return false;
}
}
mp[start]=end;//说明新的日程可以放到最后的位置
return true;
}
};
/**
* Your MyCalendar object will be instantiated and called as such:
* MyCalendar* obj = new MyCalendar();
* bool param_1 = obj->book(start,end);
*/