731. 我的日程安排表 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)

示例:

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 函数最多不超过 1000次。

调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]。

class MyCalendarTwo {

        class BSTNode{
int start, end;
//这个变量用来看是不是三重的
//开始是false,插入一个就是true,在插入的话如果是true就是三重
boolean overlap;
BSTNode left, right;
public BSTNode(int s, int e) {
this.start = s; this.end = e;
this.overlap = false;
}
} BSTNode root; public MyCalendarTwo() { } public boolean book(int start, int end) {
if (!insertable(root, start, end)) return false;
root = insert(root, start, end);
return true;
} private boolean insertable(BSTNode node, int start, int end) {
if (start >= end || node == null)
return true; if (start >= node.end)
return insertable(node.right, start, end);
if (end <= node.start)
return insertable(node.left, start, end); if (node.overlap) return false; if (node.start <= start && end <= node.end)
return true; return insertable(node.left, start, node.start) &&
insertable(node.right, node.end, end);
} private BSTNode insert(BSTNode node, int start, int end) {
if (start >= end) return node;
if (node == null) {
return new BSTNode(start, end);
} if (node.start >= end) {
node.left = insert(node.left, start, end);
return node;
} if (node.end <= start) {
node.right = insert(node.right, start, end);
return node;
} int minS = Math.min(start, node.start);
int maxS = Math.max(start, node.start);
int minE = Math.min(end, node.end);
int maxE = Math.max(end, node.end); node.start = maxS;
node.end = minE;
node.overlap = true; node.left = insert(node.left, minS, maxS);
node.right = insert(node.right, minE, maxE); return node;
}
} /**
* Your MyCalendarTwo object will be instantiated and called as such:
* MyCalendarTwo obj = new MyCalendarTwo();
* boolean param_1 = obj.book(start,end);
*/

最新文章

  1. ACM: HDU 5418 Victor and World - Floyd算法+dp状态压缩
  2. Ubuntu 10.04 32位桌面版+OpnERP 6.1.1
  3. 【wikioi】1227 方格取数 2(费用流)
  4. lanuchy快捷操作
  5. Codeforces 719 E. Sasha and Array (线段树+矩阵运算)
  6. Java日期的格式String类型GMT,GST换算成日期Date种类
  7. 宏观CMS--&amp;gt;功能体系结构内容管理系统
  8. Python之列表生成式、生成器、可迭代对象与迭代器
  9. POJ 1251 Jungle Roads (最小生成树)
  10. Linux零基础入门第四课
  11. SpringBoot2.0源码分析(二):整合ActiveMQ分析
  12. 雷林鹏分享:C# 数组(Array)
  13. js的继承方式分别适合哪些应用场景?
  14. day46
  15. C++11 自动推导auto
  16. W-D-S-UART编程
  17. react-ssr
  18. Mac pycharm专业版安装以及破解方法
  19. 用JS获得QQ号码的昵称,头像,生日
  20. 不错网络性能相关的文章-BaiduRPC

热门文章

  1. Vue + Element-ui实现后台管理系统(1) --- 总述
  2. Tomcat服务器的下载与安装,修改端口号
  3. Web快速输入标签
  4. 如何得知某期刊是否被EI收錄?
  5. java -&gt;网络通信协议(UDP协议、TCP协议)
  6. video 全屏,播放,隐藏控件。
  7. Kubernetes学习笔记(二):部署托管的Pod -- 存活探针、ReplicationController、ReplicaSet、DaemonSet、Job、CronJob
  8. Postgres基础操作
  9. python3.x 基础七:面向对象进阶
  10. python3.x 基础二:内置函数