计算最大重叠区间个数的一种方法
问题描述
- 实现一个EventManager类来管理个人日程,通过该类的一个方法
- book(int day, int start, int end)
- 来添加新事件
- 待添加的新事件发生在day,这是一个整数,表示一年里的第day天
- start表示事件的起始时间,为该day天的第start小时
- end表示该事件的结束时间,为该day天的第end小时。
- 例如:
- book(1,8,10)表示添加一个在1月1日(第1天)的8点开始,10点结束的事件。
- book(1, 0, 1)表示在第1天的0:00-1:00的事件
- book(1, 22,24)表示在第1天的22:00-24:00的事件
- 事件的长度单位是小时,不需要考虑分钟。
- 约束条件:1<=day<=365(无需考虑闰年之类的问题),0<=start<end<=24。
- “k-重叠”是指:有k个事件的时间范围在某个时间段内存在交集,即这k个事件在某个小时内都已经启动且尚未结束。
- book(…)方法的返回值是:当本次调用结束后的最大k值。
- 例如:
- EventManager.book(1, 10, 20); // returns 1
- EventManager.book(1, 1, 7); // returns 1
- EventManager.book(1, 10, 22); // returns 2
- EventManager.book(1, 5, 15); // returns 3
- EventManager.book(1, 5, 12); // returns 4
- EventManager.book(1, 7, 10); // returns 4
解决方法
类似时间这种线性的变量,可将其转化在数轴上解决
这里运用了Treemap集合,key值为时间,value为当前时间的活跃活动,该集合默认以key按自然顺序排列。
当活动开始时,就在key值为start的点将其值+1
同样,活动结束时,就在key值为start的点将其值-1
之后,遍历所有map比较得出最大值
主要代码为
map.put(start,map.get(start)+1);
map.put(end,map.get(end)-1);