我的日程安排表 I
我的日程安排表 I
问题描述:
实现一个 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]。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/my-calendar-i
思路:
不能加入日程的情况有3种:
1、开始时间不合适,在某个日程的开始和结束日程的中间
2、结束时间不合适,在某个日程的开始和结束日程的中间
3、开始时间和结束时间涵盖某个日程
用一个二维vector来存储所有的日程,其中每行表示一个日程,每行的第一个元素表示每个日程的开始时间,每行的第二个元素表示每个日程的结束时间。
在一个新的日程到来之时,遍历所有已存在的日程,如果有冲突,返回false;否则将新日程插入到日程表中,并返回true。
需要注意,在判断冲突的时候,是大于还是大于等于,是小于还是小于等于。
题解:
class MyCalendar {
public:
vector<int> tmp;
vector<vector<int>> vec;
MyCalendar() {
}
bool book(int start, int end) {
int n = vec.size();
for (int i = 0; i < n; i++) {
if ((start >= vec[i][0] && start < vec[i][1]) || (vec[i][0] < end && vec[i][1] >= end) ||
(start <= vec[i][0] && end >= vec[i][1])) {
return false;
}
}
tmp.push_back(start);
tmp.push_back(end);
vec.push_back(tmp);
tmp.clear();
return true;
}
};