我的日程安排表 II
我的日程安排表 II🟨
做题过程
本来以为把I中的哈希集合改成哈希表就行了,但是懒标记不能像I中那么处理了。
算法概述
本题要求为用一个类来管理日程安排(区间单位),当交叉或者重叠的区间超过三次,则不再插入,返回错误。还是使用 线段树 或者说 差分数组 。
线段树:
- 时间复杂度为: 为线段树的最大深度
- 空间复杂度为
差分数组:
- 时间复杂度为:元素最大个数是2n,2略了,然后是红黑树的操作需要
- 空间复杂度为:就2n,常数不看
JAVA
1 | // 线段树 |
重要实例方法及属性(JAVA)
tree.putIfAbsent(key,value)
:有还是没有
总结
线段树的核心思路在这道题中的体现即用lazy标记,也就是数组中的第1个元素来记录当前区间是否与目标区间完美匹配(被目标区间完全包含),而第0个元素则用来在查询的过程中向上传递子节点的状态,一直到栈底,也就是面向整个数据有效范围的查询。总的来说:
- 一般标记的用途是记录在该节点(区间)下方(包括自身)的子节点有多少次标记,由子节点向上传递标记来更新。
- 懒标记的用途是记录该节点(区间)被目标区间包含(标记)的次数。
- 一般标记需要向上传播,可以看作一种媒介,而懒标记则可以看作实际向上传播的主体。
还需要注意的细节:
- 完全二叉树式的序号关系。
- 栈顶是最小的匹配节点,更新的搜索是自顶向下的,而更新是自底向上的。
相对来说,差分数组的思路很直观:
- 先将预约加入
- 通过
TreeMap
有序遍历所有预约从开始到结束(这里利用了TreeMap
的特性: 有序 ) - 每个时间点的遍历都会检查
maxBook
是否超出了条件,超出则撤销
这里的优化点就是TreeMap
基于红黑树实现,复杂度较低,且有序,不然标记数组其实也行(如果有效数据范围小的话)。关键是 保证时间顺序 的同时记录频次。
- Title: 我的日程安排表 II
- Author: tobegold574
- Created at : 2025-01-03 13:09:25
- Updated at : 2025-03-26 14:58:13
- Link: https://tobegold574.me/2025/01/03/我的日程安排表-II/
- License: This work is licensed under CC BY-NC-SA 4.0.
Comments