My Calendar III
Posted wemo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了My Calendar III相关的知识,希望对你有一定的参考价值。
题目
实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排。
MyCalendar 有一个 book(int start, int end) 方法。它意味着在start到end时间内增加一个日程安排,注意,这里的时间是半开区间,即 [start, end), 实数 x 的范围为, start <= x < end。
当 K 个日程安排有一些时间上的交叉时(例如K个日程安排都在同一时间内),就会产生 K 次预订。
每次调用 MyCalendar.book方法时,返回一个整数 K ,表示最大的 K 次预订。
请按照以下步骤调用MyCalendar 类: MyCalendar cal = new MyCalendar(); MyCalendar.book(start, end)
题目大意
记录一组活动区间,求区间的最大重叠次数
例子:
MyCalendarThree();
MyCalendarThree.book(10, 20); // returns 1
MyCalendarThree.book(50, 60); // returns 1
MyCalendarThree.book(10, 40); // returns 2
MyCalendarThree.book(5, 15); // returns 3
MyCalendarThree.book(5, 10); // returns 3
MyCalendarThree.book(25, 55); // returns 3
大致思路
TreeMap红黑树
利用TreeMap记录时间端点的次数,起点计数+1,终点计数-1。
每增加一个活动,遍历TreeMap并累加,累计值的最大值即为当前的最大重叠活动次数。
代码
class MyCalendarThree {
private Map<Integer, Integer> dmap;
public MyCalendarThree() {
dmap = new TreeMap<>();
}
public int book(int start, int end) {
int cnt = 0, ans = 0;
dmap.put(start, dmap.getOrDefault(start, 0) + 1);
dmap.put(end, dmap.getOrDefault(end, 0) - 1);
for (int key : dmap.keySet()) {
cnt += dmap.get(key);
ans = Math.max(ans, cnt);
}
return ans;
}
}
以上是关于My Calendar III的主要内容,如果未能解决你的问题,请参考以下文章