zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    windows常用命令
    Qt 添加 QtNetwork 库文件
    LoadLibrary加载动态库失败
    C++11 Function 使用场景
    编程书籍集
    代码重构例集
    多重循环编码规范
    vim 命令学习(基础篇)
    QT构建窗体(父窗体传为野指针)异常案例
    JAVA_SE基础——26.[深入解析]局部变量与成员变量的差别
  • 原文地址:https://www.cnblogs.com/wemo/p/10432266.html
Copyright © 2011-2022 走看看