[LeetCode]732. 我的日程安排表 III
题目
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相关推荐
- Python描述 LeetCode 732. 我的日程安排表 III
Python描述 LeetCode 732. 我的日程安排表 III 大家好,我是亓官劼(qí guān jié ),在[亓官劼]公众号.CSDN.GitHub.B站等平台分享一些技术博文,主要包 ...
- java人员安排表_Java实现 LeetCode 732 我的日程安排表 III(暴力 || 二叉树)
732. 我的日程安排表 III 实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排. MyCalendar 有一个 book(int start, int end)方法 ...
- LeetCode 732. 我的日程安排表 III
732. 我的日程安排表 III [离散化的差分数组] class MyCalendarThree {// 离散差分数组 1:37Map<Integer, Integer> map = n ...
- LeetCode 732. 我的日程安排表 III(差分思想)
文章目录 1. 题目 2. 解题 1. 题目 实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安排. MyCalendar 有一个 book(int start, int ...
- 732. 我的日程安排表 III
732. 我的日程安排表 III 原始题目链接:https://leetcode.cn/problems/my-calendar-iii/ 当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排 ...
- 【宫水三叶的刷题日记】732. 我的日程安排表 III
题目描述 这是 LeetCode 上的 「732. 我的日程安排表 III」 ,难度为 「困难」. Tag : 「线段树(动态开点)」.「分块」.「线段树」 当 个日程安排有一些时间上的交叉时(例如 ...
- 【LeetCode】732. 我的日程安排表 III
传送门:https://leetcode-cn.com/problems/my-calendar-iii/ 一.题目描述 实现一个 MyCalendar 类来存放你的日程安排,你可以一直添加新的日程安 ...
- LeetCode 729. 我的日程安排表 I(set 二分查找)
文章目录 1. 题目 2. 解题 2.1 set 二分查找 2.2 差分思想 1. 题目 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安 ...
- 【JAVA】【刷题子】732. 我的日程安排表
愿高三学子们都高考顺利,金榜题名,旗开得胜,考上理想大学! 一.题目与题目分析 题目 当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订. 给你一些日程 ...
最新文章
- 【译】Monolith first —— Martin Fowler 对于微服务架构的看法
- 汇总|目标检测中的数据增强、backbone、head、neck、损失函数
- 用yui compressor 压缩 javascirpt脚本
- 本人常用的一些编码小Tips(虽然不多,但很好用)
- 拔掉 MacBookPro,用 8GB 树莓派4 工作一天,体验原来是这样的
- [功能发布]Excel催化剂地图可视化功能正式发布,欢迎使用!
- 软件测试测试 python_Python测试简介
- CTO职场解惑指南系列(一)
- Laravel 不权威导航
- 打包或者编译python程序
- dell 恢复出厂系统
- 坤坤音效键盘(Python实现)
- 新版微信支持鸿蒙os,微信突然宣布!“新功能”全面爆发,鸿蒙OS措手不及
- python xlrd pandas_Python:Pandas pd.read_excel提供ImportError:为Excel supp安装xlrd = 0.9.0
- python txt文件的数据筛选
- ASBR(自治系统边界路由器)
- 计算物体自由下落的距离
- chipseq MACS2 call peaks 报错解决方法——创建虚拟环境
- JVM-从熟悉到精通
- 蓝牙map协议源码解析