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;
    }
}
原文地址:https://www.cnblogs.com/wemo/p/10432266.html