题目地址:
https://leetcode.com/problems/my-calendar-i/
实现一个类,可以做如下操作:给定一个区间 [ a , b ] [a,b] [a,b],如果之前存储的区间里和这个区间没有相交的(端点重合不算),就将其插入返回true,否则不插入返回false。
可以用java里的TreeMap来做,key为区间左端点,value为对应的右端点。在插入时,先将左右两边左端点最靠近 a a a的区间找出来(可以用TreeMap的floorKey和ceilingKey方法来做),左边区间与 [ a , b ] [a,b] [a,b]不相交当且仅当左边区间不存在,或左边区间的右端点小于等于 a a a,而右边区间与 [ a , b ] [a,b] [a,b]不相交当且仅当右边区间不存在,或右边区间的左端点大于等于 b b b。代码如下:
import java.util.TreeMap;
public class MyCalendar {
private TreeMap<Integer, Integer> map;
public MyCalendar() {
map = new TreeMap<>();
}
public boolean book(int start, int end) {
Integer prev = map.floorKey(start), next = map.ceilingKey(start);
if ((prev == null || map.get(prev) <= start) && (next == null || end <= next)) {
map.put(start, next);
return true;
}
return false;
}
}
每次book时间复杂度 O ( log n ) O(\log n) O(logn), n n n为已经在map里的元素个数,空间 O ( n ) O(n) O(n)。