题目

732. 我的日程安排表 III

732. 我的日程安排表 III
当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订。给你一些日程安排 [start, end) ,请你在每个日程安排添加后,返回一个整数 k ,表示所有先前日程安排会产生的最大 k 次预订。实现一个 MyCalendarThree 类来存放你的日程安排,你可以一直添加新的日程安排。MyCalendarThree() 初始化对象。
int book(int start, int end) 返回一个整数 k ,表示日历中存在的 k 次预订的最大值。示例:输入:
["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提示:0 <= start < end <= 109
每个测试用例,调用 book 函数最多不超过 400次

解法

方法1:TreeMap

class MyCalendarThree {TreeMap<Integer, Integer> tm;public MyCalendarThree() {tm = new TreeMap<>();}public int book(int start, int end) {tm.put(start, tm.getOrDefault(start, 0) + 1);tm.put(end, tm.getOrDefault(end, 0) - 1);int maxx = 0, count = 0;for (int t : tm.keySet()) {count += tm.get(t);maxx = Math.max(maxx, count);}return maxx;}
}

方法2:线段树

class MyCalendarThree {//然一个比较实用的估点方式可以「尽可能的多开点数」,利用题目给定的空间上界和我们创建的自定义类// (结构体)的大小,尽可能的多开( Java 的 128M 可以开到 5 * 10^6 以上)。class Node {int ls, rs;//分别代表当前节点的左右子节点在线段树数组 tr 中的下标int lazy;//懒标记int maxx;//当前区间的最大值}int N = (int) 1e9 + 10;int cnt = 1;//动态开点的下标int M = 120010;Node[] tr = new Node[M];//l,r 为当前节点存储的区间 L,R表示要修改的前,这个区间不会变,设置成大写void update(int u, int l, int r, int L, int R, int v) {//[l,r]区间被[L,R]覆盖if (L <= l && r <= R) {tr[u].maxx += v;tr[u].lazy += v;return;}lazyCreate(u);pushdown(u);int mid = l + r >> 1;if (L <= mid) update(tr[u].ls, l, mid, L, R, v);if (R > mid) update(tr[u].rs, mid + 1, r, L, R, v);pushup(u);}int query(int u, int l, int r, int L, int R) {if (L <= l && r <= R) return tr[u].maxx;lazyCreate(u);pushdown(u);int mid = l + r >> 1;int res = 0;if (L <= mid) res = Math.max(res, query(tr[u].ls, l, mid, L, R));if (R > mid) res = Math.max(res, query(tr[u].rs, mid + 1, r, L, R));return res;}void lazyCreate(int u) {if (tr[u] == null) {tr[u] = new Node();}if (tr[u].ls == 0) {tr[u].ls = ++cnt;tr[tr[u].ls] = new Node();}if (tr[u].rs == 0) {tr[u].rs = ++cnt;tr[tr[u].rs] = new Node();}}void pushup(int u) {tr[u].maxx = Math.max(tr[tr[u].ls].maxx, tr[tr[u].rs].maxx);}void pushdown(int u) {tr[tr[u].ls].lazy += tr[u].lazy;tr[tr[u].rs].lazy += tr[u].lazy;tr[tr[u].ls].maxx += tr[u].lazy;tr[tr[u].rs].maxx += tr[u].lazy;tr[u].lazy = 0;}public MyCalendarThree() {}public int book(int start, int end) {update(1, 1, N + 1, start + 1, end, 1);int res = query(1, 1, N + 1, 1, N + 1);return res;}
}

[LeetCode]732. 我的日程安排表 III相关推荐

  1. Python描述 LeetCode 732. 我的日程安排表 III

    Python描述 LeetCode 732. 我的日程安排表 III   大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包 ...

  2. java人员安排表_Java实现 LeetCode 732 我的日程安排表 III(暴力 || 二叉树)

    732. 我的日程安排表 III 实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排. MyCalendar 有一个 book(int start, int end)方法 ...

  3. LeetCode 732. 我的日程安排表 III

    732. 我的日程安排表 III [离散化的差分数组] class MyCalendarThree {// 离散差分数组 1:37Map<Integer, Integer> map = n ...

  4. LeetCode 732. 我的日程安排表 III(差分思想)

    文章目录 1. 题目 2. 解题 1. 题目 实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排. MyCalendar 有一个 book(int start, int ...

  5. 732. 我的日程安排表 III

    732. 我的日程安排表 III 原始题目链接:https://leetcode.cn/problems/my-calendar-iii/ 当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排 ...

  6. 【宫水三叶的刷题日记】732. 我的日程安排表 III

    题目描述 这是 LeetCode 上的 「732. 我的日程安排表 III」 ,难度为 「困难」. Tag : 「线段树(动态开点)」.「分块」.「线段树」 当 个日程安排有一些时间上的交叉时(例如 ...

  7. 【LeetCode】732. 我的日程安排表 III

    传送门:https://leetcode-cn.com/problems/my-calendar-iii/ 一.题目描述 实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安 ...

  8. LeetCode 729. 我的日程安排表 I(set 二分查找)

    文章目录 1. 题目 2. 解题 2.1 set 二分查找 2.2 差分思想 1. 题目 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安 ...

  9. 【JAVA】【刷题子】732. 我的日程安排表

    愿高三学子们都高考顺利,金榜题名,旗开得胜,考上理想大学! 一.题目与题目分析 题目 当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订. 给你一些日程 ...

最新文章

  1. 【译】Monolith first —— Martin Fowler 对于微服务架构的看法
  2. 汇总|目标检测中的数据增强、backbone、head、neck、损失函数
  3. 用yui compressor 压缩 javascirpt脚本
  4. 本人常用的一些编码小Tips(虽然不多,但很好用)
  5. 拔掉 MacBookPro,用 8GB 树莓派4 工作一天,体验原来是这样的
  6. [功能发布]Excel催化剂地图可视化功能正式发布,欢迎使用!
  7. 软件测试测试 python_Python测试简介
  8. CTO职场解惑指南系列(一)
  9. Laravel 不权威导航
  10. 打包或者编译python程序
  11. dell 恢复出厂系统
  12. 坤坤音效键盘(Python实现)
  13. 新版微信支持鸿蒙os,微信突然宣布!“新功能”全面爆发,鸿蒙OS措手不及
  14. python xlrd pandas_Python:Pandas pd.read_excel提供ImportError:为Excel supp安装xlrd = 0.9.0
  15. python txt文件的数据筛选
  16. ASBR(自治系统边界路由器)
  17. 计算物体自由下落的距离
  18. chipseq MACS2 call peaks 报错解决方法——创建虚拟环境
  19. JVM-从熟悉到精通
  20. 蓝牙map协议源码解析

热门文章

  1. php中tabindex,HTML TabIndex属性
  2. 职称计算机考试word2003,最新职称计算机考试Word2003操作练习
  3. php分前后端吗,前后端分离和不分离的区别是什么
  4. 浅谈网络代理的两大分类和简单实现
  5. 收藏ORACLE ERP实施公司
  6. 杨辉三角形--2021蓝桥杯Java组
  7. 【内容替换】shell脚本批量替换文件内容(替换ip及其他配置文件)
  8. 5.什么是EDA技术
  9. 通俗易懂的傅里叶变换讲解(多图预警)
  10. java程序jar包xjar加密及破解解密