我的日程安排表(2022-6-6)(内含I、II、III的解法)
732. 我的日程安排表 III(2022-6-6)
当 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 <= 10^9
- 每个测试用例,调用 book 函数最多不超过 400次
解题思路
此系列的题如下:
729. 我的日程安排表 I
731. 我的日程安排表 II
732. 我的日程安排表 III
一阶段:
此阶段,提炼题意为「如果时间有重复就不可以添加,并返回false」;针对一个新的区间我们只需要查找之前的日历中是否包含此区间的端点。
通常我们会想到创建一个[0,10^9]
的数组来保存每一个区间的状态,但每次都要遍历一遍会非常耗时,且费空间;
我们可以仅仅在数组中保存已开辟的区间,然后遍历这些已存在区间,验证新的区间是否可以被添加。
再加一点优化,将数组维持为有序的,这样就可以通过「二分查找」更快的寻找到最近的区间来验证是否重复。
var MyCalendar = function() {this.arr = []
};
MyCalendar.prototype.book = function(start, end) {const arr = this.arr;let low = 0, high = arr.length;while(low < high) {const mid = low + high >> 1;if (arr[mid][1] <= start) {low = mid + 1;} else if (arr[mid][0] >= end) {high = mid;} else {return false;}}arr.splice(low, 0, [start, end]);return true;
};
二阶段:
本阶段的题意:「不允许重复三次,否则不让添加,返回false」。
和一阶段不同,我们需要对每个区间进行计数,正派的解法是「线段树」,但是有些复杂俺不会;而且个人觉得「差分数组」更符合程序猿的思路,即「尽量以简单明了的方式解决问题」。
「差分数组」:对一个区间内的开头进行加一,末尾减一,这样只要累加区间数组,就可以统计区间内每一个阶段的重复次数,只要重复次数超过三次就返回false,否则遍历完后返回true。
记得以前有用到「差分数组」的思想,但是我找不到那道题了。。。
var MyCalendarTwo = function() {this.cal = {}
};MyCalendarTwo.prototype.book = function(start, end) {this.cal[start] = (this.cal[start] || 0) + 1this.cal[end] = (this.cal[end] || 0) - 1let total = 0for(const key in this.cal){if(total < 3) {total += this.cal[key]}else {this.cal[start] = this.cal[start] - 1this.cal[end] = this.cal[end] + 1return false}}return true
};
三阶段:
本阶段的题意:直接就是让统计重复次数了,更符合二阶段的解法了(统计最大值),还是「差分数组」直接上代码!
var MyCalendarThree = function() {this.cal = {}this.max = 0
};
MyCalendarThree.prototype.book = function(start, end) {this.cal[start] = (this.cal[start] || 0) + 1this.cal[end] = (this.cal[end] || 0) - 1let total = 0for(const key in this.cal){total += this.cal[key]this.max = Math.max(this.max,total)}return this.max
};
对「线段树」感兴趣的小伙伴可以看看「OI的解释」;这里是「线段树」关于本题的官方题解和入门题解
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/my-calendar-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的日程安排表(2022-6-6)(内含I、II、III的解法)相关推荐
- 我的日程安排表I II III
我的日程安排表I 我的日程安排表II 我的日程安排表III 转载做题方法! 今天介绍的方法叫插旗法,其实我最早是在253. 会议室Ⅱ中介绍过,但是由于很多同学不是会员,刚好今天又看到这种类型的题,所以 ...
- leetcode 729, 731, 732. My Calendar I, II, III | 729. 我的日程安排表 I, II, III(线段树)
729. My Calendar I https://leetcode.com/problems/my-calendar-i/ 题解 看了左神课之后,自己实现了下改造后的线段树(非常不优雅),因为数组 ...
- 2022年考研高数一18题解法
- 2022北京高考数学压轴题21题的一种解答
2022年北京高考数学压轴题21题的一种解答 如题,近日2022年北京高考数学最后一题已经浮出水面,在此以我微薄的才学,对2022北京高考数学压轴题(新定义题型)做一种解答.该题型十分灵活,我的解答未 ...
- 恒瑞医药卡瑞利珠单抗七大瘤种获2022版中国临床肿瘤学会诊疗指南19项推荐
上海2022年4月30日 /美通社/ -- 近日,<中国临床肿瘤学会常见恶性肿瘤诊疗指南(2022版)>(简称"CSCO指南")完成更新并已发布.基于循证医学证据.汇聚 ...
- 联想拯救者Y7000P 2022版 重装系统 win11重装win10
联想拯救者Y7000P 2022版 重装系统 win11重装win10 联想拯救者Y7000P 2022版 重装系统 win11重装win10 一.安装前的准备 二.安装系统 三.问题整理 联想拯救者 ...
- 登陆港股市场,阳光保险的 “价值锚点”
不确定性环境里,信心比黄金还重要. 最近,利好信号频频出现在保险行业,资本信心不断加固.上个月月底,个人养老金制度启动实施,市场迅速传来喝彩声.这不仅将加快推动养老保险作为第三支柱的壮大,而且还为资本 ...
- 【从零开始NetDevOps】第二章网工速通Python
<从零开始NetDevOps>是本人8年多的NetDevOps实战总结的一本书(且称之为书,通过公众号连载的方式,集结成册,希望有天能以实体书的方式和大家相见). NetDevOps是指以 ...
- 嵌入式linux 项目开发(一)——HTML编程
嵌入式linux 项目开发(一)--HTML编程 本文主要讲解HTML的基础知识,主要是涉及嵌入式web服务器中数据交互HTML页面表单制作部分. 一.HTML简介 HTML是Hypertext Ma ...
- 【正在完善】CSS 计数器
CSS 计数器 李俊才 的 CSDN 博客 邮箱 :291148484@163.com CSDN 主页:https://blog.csdn.net/qq_28550263?spm=1001.2101. ...
最新文章
- SQLServer 2005 XML 在 T-SQL 查询中的典型应用[转]
- 文巾解题3. 无重复字符的最长子串
- Firefox 10正式发布
- 导致自然语言理解的困难的主要因素是什么?
- Java 解析 XML
- 前端到底是自学好还是培训好?
- iOS底层探索之多线程(十三)—锁的种类你知多少?
- Atitit aes 加密法php实现
- 模糊控制器原理笔记(附简单demo以及MATLAB相关操作)
- Mac如何清理应用软件
- 从一份外卖报告折射出的就业新选择
- 深入Java虚拟机(五)垃圾收集
- 笔记本电脑数据怎么恢复?笔记本电脑数据恢复用什么工具?
- StarUML for Mac(UML软件建模器)
- 30天数据分析与机器学习实践之Day16——Python文本数据分析:新闻分类任务
- 深入理解模型视图、自定义模型
- 柳岩清晨晒素颜照称拿去辟邪 网友称吓人没认出来
- XenDesktop 5 .VS.View 4.5
- ACM-ICPC 2018 焦作赛区网络预赛 A. Magic Mirror (水)| B . Mathematical Curse(dp)
- 51单片机花样流水灯