携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
今天是周日,临急抱佛脚了,也庆幸能冲出一题
我的日程安排I
该题出自力扣的729题 —— 我的日程安排I【中等题】,经典线段树,用了,但是没有完全使用哈哈哈
审题
实现一个 MyCalendar 类来存放你的日程安排。如果要添加的日程安排不会造成 重复预订 ,则可以存储这个新的日程安排。
当两个日程安排有一些时间上的交叉时(例如两个日程安排都在同一时间内),就会产生 重复预订 。
- 日程可以用一对整数 start 和 end 表示,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end 。
- 实现 MyCalendar 类:
- MyCalendar() 初始化日历对象。
- boolean book(int start, int end) 如果可以将日程安排成功添加到日历中而不会导致重复预订,返回 true 。否则,返回 false 并且不要将该日程安排添加到日历中。
-
题意相对拗口,但是并不难理解,届时每次调用book方法都会传入两个预定时间,需要判断预定的时间是否会对之前的时间冲突
-
利用线段树可以解决,但是选择了另一种方法
-
利用HashMap的相关API,判断是否存在冲突
- ceilingKey :返回大于或等于给定键的最小键,如果没有这样的键,则null
- floorKey: 返回小于或等于给定键的最大键,如果没有这样的键,则null
-
因此可以利用cellingKey去传入start,判断大于start的最小值的 结束时间,是否比end的时间要小,如果小则证明包含在内
-
利用floorKey传入start,判断小于start的最大值的结束时间,是否比start要大,则证明包含在内
-
可推断出book方法的实现
-
初始化方法,需要利用TreeMap
编码
class MyCalendar {
public MyCalendar() {
map = new TreeMap<>();
map.put(-1,-1);
map.put(1000000000,1000000000);
}
TreeMap<Integer,Integer> map;
public boolean book(int start, int end) {
Integer max = map.ceilingKey(start);
Integer min = map.floorKey(start);
if (max < end || map.get(min) > start)return false;
map.put(start,end);
return true;
}
}