My Calendar II 我的日程安排表 II

实现一个 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(50, 60); // returns true
MyCalendar.book(10, 40); // returns true
MyCalendar.book(5, 15); // returns false
MyCalendar.book(5, 10); // returns true
MyCalendar.book(25, 55); // returns true
解释: 
前两个日程安排可以添加至日历中。 第三个日程安排会导致双重预订,但可以添加至日历中。
第四个日程安排活动(5,15)不能添加至日历中,因为它会导致三重预订。
第五个日程安排(5,10)可以添加至日历中,因为它未使用已经双重预订的时间10。
第六个日程安排(25,55)可以添加至日历中,因为时间 [25,40] 将和第三个日程安排双重预订;
时间 [40,50] 将单独预订,时间 [50,55)将和第二个日程安排双重预订。

说明:

  • 每个测试用例,调用 MyCalendar.book 函数最多不超过 100次。
  • 调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]

思路:这道题需要借用到第一个问题的思路:My Calendar I 我的日程安排表 I,我们在book操作时,拿当前元素和前面每一个元素相比,如果发现重叠的片段就加入到MyCalendar的book操作中,如果MyCalendar的book操作返回false,那么我们返回true,否则把当前区间加到vector中。

举题目的示例说明:我们有两个变量,vector<pair<int,int>> pairs,这个只存储当前区间的范围。MyCalendar *cal 这个用于存储重复片段。

调用过程如下:

参考代码:

class MyCalendar {
public:
	set<pair<int, int>> store;
	MyCalendar() {

	}
	bool book(int start, int end) {
		for (auto s : store) {
			if (max(s.first, start) < min(end, s.second)) return false;
		}
		store.insert({ start, end });
		return true;
	}
};
class MyCalendarTwo {
public:
	vector<pair<int, int>> pairs;
	MyCalendarTwo() {
	}
	bool book(int start, int end) {
		MyCalendar *cal=new MyCalendar();
		for (auto p : pairs) {
			if (max(p.first, start) < min(p.second, end)) {
				auto inter = make_pair(max(p.first, start), min(p.second, end));
				if (!cal->book(inter.first, inter.second)) return false;
			}
		}
		pairs.push_back({ start,end });
		return true;
	}
};

/**
 * Your MyCalendarTwo object will be instantiated and called as such:
 * MyCalendarTwo obj = new MyCalendarTwo();
 * bool param_1 = obj.book(start,end);
 */

猜你喜欢

转载自blog.csdn.net/qq_26410101/article/details/83214923
ii