输入:
["MyCalendarThree", "book", "book", "book", "book", "book", "book"]
[[], [10, 20], [50, 60], [10, 40], [5, 15], [5, 10], [25, 55]]
输出:
[null, 1, 1, 2, 3, 3, 3]解释:
MyCalendarThree myCalendarThree = new MyCalendarThree();
myCalendarThree.book(10, 20); // 返回 1 ,第一个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。
myCalendarThree.book(50, 60); // 返回 1 ,第二个日程安排可以预订并且不存在相交,所以最大 k 次预订是 1 次预订。
myCalendarThree.book(10, 40); // 返回 2 ,第三个日程安排 [10, 40) 与第一个日程安排相交,所以最大 k 次预订是 2 次预订。
myCalendarThree.book(5, 15); // 返回 3 ,剩下的日程安排的最大 k 次预订是 3 次预订。
myCalendarThree.book(5, 10); // 返回 3
myCalendarThree.book(25, 55); // 返回 3
本来这题都是用的线段树来解决,我实在看不懂,在b站上找到了一个大哥用TreeMap做的,又学到了!!
题意很好理解,只要是在一个时间段,就为预定,本来我是打算自己暴力判断,不过我想来想去,放弃了~~
首相要想真正理解这道题,我们得分清楚HashMap和TreeMap的区别,为了分清它俩,我想了一晚上,今天早上起来看了别人的代码,自己改了一下,才真正理解到。
上代码!!
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class _732 {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("bob", "books");
map.put("c", "concurrent");
map.put("alkjjkhk", "a lock");
System.out.println(map.keySet());
Map<String, String> books = new TreeMap<>();
books.put("bob", "books");
books.put("casdaw", "concurrent");
books.put("a", "a lock");
System.out.println(books.keySet());
}
}
HashMap:[c, bob, alkjjkhk]
TreeMap:[a, bob, casdaw]
你会发现,明明按照字典:HashMap的c在b的后面,a在b的前面,为啥全乱了,
而TreeMap却没有收到影响,这就是TreeMap的key排序,会他的key按照自然排序
好了,理解了这玩意,解题就好说了;上代码!
class MyCalendarThree {
TreeMap<Integer,Integer> map;
public MyCalendarThree() {
map=new TreeMap<Integer,Integer>();
}
public int book(int a, int b) {
int cont=0;
int max=0;
map.put(a,map.getOrDefault(a,0)+1);
map.put(b,map.getOrDefault(b,0)-1);
for(int i:map.values()){
cont+=i;
max=Math.max(cont,max);
}
return max;
}
}
来看看大佬是怎么解决的,我的理解:
1.把开始a和结束b全部存入map里面,下一次存入的时候进行判断,如果有这个k,就把这个k映射的v+1,没有的话赋值1
2.如果有这个b的k,我们就拿出映射的v-1,没有就赋值-1,
最后遍历所有的v相加,取最大值