# 0731. My Calendar II
###### tags: `Leetcode` `Medium` `Design` `TreeMap` `Line Sweep`
## 思路
### $O(NlogN)$ each book() call
把所有和```[start, end)```重合的interval都拿出来
然后看他们有没有重叠的 如果有的话就说明当下interval不能被加进去
### $O(N)$ each book() call
插入treemap的时间是$O(logN)$ 遍历所有timeslot的复杂度是$O(N)$
用treemap存 然后用差分法 这样就不用排序
## Code
### 思路一
```java=
class MyCalendarTwo {
List<int[]> time;
public MyCalendarTwo() {
time = new ArrayList<>();
}
public boolean book(int start, int end) {
List<int[]> temp = new ArrayList<>();
for(int[] t:time){
if(!(t[0]>=end || t[1]<=start)){
temp.add(t);
}
}
Collections.sort(temp, (a,b)->(a[0]==b[0]?a[1]-b[1]:a[0]-b[0]));
for(int i=1; i<temp.size(); i++){
if(temp.get(i)[0]<temp.get(i-1)[1]) return false;
}
time.add(new int[]{start, end});
return true;
}
}
```
### 思路二 TreeMap
```java=
class MyCalendarTwo {
TreeMap<Integer, Integer> map;
public MyCalendarTwo() {
map = new TreeMap<>();
}
public boolean book(int start, int end) {
map.put(start, map.getOrDefault(start, 0)+1);
map.put(end, map.getOrDefault(end, 0)-1);
int count = 0;
for(Map.Entry<Integer, Integer> entry:map.entrySet()){
count += entry.getValue();
if(count>2){
map.put(start, map.get(start)-1);
map.put(end, map.get(end)+1);
return false;
}
}
return true;
}
}
```