Java实现 LeetCode 732 我的日程安排表 III(暴力 || 二叉树)
732. 我的日程安排表 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)
示例 1:
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
解释:
前两个日程安排可以预订并且不相交,所以最大的K次预订是1。
第三个日程安排[10,40]与第一个日程安排相交,最高的K次预订为2。
其余的日程安排的最高K次预订仅为3。
请注意,最后一次日程安排可能会导致局部最高K次预订为2,但答案仍然是3,原因是从开始到最后,时间[10,20],[10,40]和[5,15]仍然会导致3次预订。
说明:
每个测试用例,调用 MyCalendar.book 函数最多不超过 400次。
调用函数 MyCalendar.book(start, end)时, start 和 end 的取值范围为 [0, 10^9]。
PS:
暴力
class MyCalendarThree {
private TreeMap<Integer, Integer> calendar;
public MyCalendarThree() {
calendar = new TreeMap<>();
}
public int book(int start, int end) {
// 添加至日程中
calendar.put(start, calendar.getOrDefault(start, 0) + 1);
calendar.put(end, calendar.getOrDefault(end, 0) - 1);
// 记录最大活跃的日程数
int max = 0;
// 记录活跃的日程数
int active = 0;
for (Integer d : calendar.values()) {
// 以时间线统计日程
active += d;
// 找到活跃事件数量最多的时刻,记录下来。
if (active > max) {
max = active;
}
}
return max;
}
}
/**
* Your MyCalendarThree object will be instantiated and called as such:
* MyCalendarThree obj = new MyCalendarThree();
* int param_1 = obj.book(start,end);
*/
PS:
二叉树
class MyCalendarThree {
public static class SegmentTree {
public static class Node {
private int lo;
private int hi;
private int range;
private int maxCover = 0;
private int lazy = 0;
private Node left;
private Node right;
public Node(int lo, int hi) {
this.lo = lo;
this.hi = hi;
this.range = hi - lo;
}
}
Node root = null;
public int addRange(int qLo, int qHi) {
checkRoot(qLo, qHi);
update(root, qLo, qHi, 1);
return root.maxCover;
}
private void update(Node root, int qLo, int qHi, int diff) {
if (root == null) {
return;
}
checkLazy(root);
if (qHi <= root.lo || root.hi <= qLo) {
return;
}
checkChildren(root);
if (qLo <= root.lo && root.hi <= qHi) {
root.maxCover += diff;
if (root.left != null) {
root.left.lazy += diff;
}
if (root.right != null) {
root.right.lazy += diff;
}
return;
}
update(root.left, qLo, qHi, diff);
update(root.right, qLo, qHi, diff);
root.maxCover = Math.max(root.left.maxCover, root.right.maxCover);
}
private void checkChildren(Node root) {
if (root.range <= 1) {
return;
}
if (root.left != null && root.right != null) {
return;
}
int mid = root.lo + (root.hi - root.lo) / 2;
if (root.left == null) {
int r = root.right == null ? mid : root.right.lo;
root.left = new Node(root.lo, r);
}
if (root.right == null) {
root.right = new Node(root.left.hi, root.hi);
}
}
private void checkLazy(Node root) {
if (root.lazy == 0) {
return;
}
root.maxCover += root.lazy;
checkChildren(root);
//propagation
if (root.left != null) {
root.left.lazy += root.lazy;
root.right.lazy += root.lazy;
}
//reset lazy
root.lazy = 0;
}
private void checkRoot(int qLo, int qHi) {
if (root == null) {
root = new Node(qLo, qHi);
return;
}
while (qHi > root.hi) {
Node newR = new Node(root.lo, Math.min(1000000000, root.hi + root.range));
newR.left = root;
newR.maxCover=root.maxCover;
root = newR;
}
while (qLo < root.lo) {
Node newR = new Node(Math.max(0, root.lo - root.range), root.hi);
newR.right = root;
newR.maxCover=root.maxCover;
root = newR;
}
}
}
SegmentTree st = new SegmentTree();
public MyCalendarThree() {
}
public int book(int start, int end) {
return st.addRange(start, end);
}
}
/**
* Your MyCalendarThree object will be instantiated and called as such:
* MyCalendarThree obj = new MyCalendarThree();
* int param_1 = obj.book(start,end);
*/
Java实现 LeetCode 732 我的日程安排表 III(暴力 || 二叉树)的更多相关文章
- Java实现 LeetCode 731 我的日程安排表 II(二叉树)
731. 我的日程安排表 II 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排. MyCalendar 有一个 book(int ...
- Java实现 LeetCode 729 我的日程安排表 I(二叉树)
729. 我的日程安排表 I 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安排. MyCalendar 有一个 book(int sta ...
- Java实现 LeetCode 220 存在重复元素 III(三)
220. 存在重复元素 III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最 ...
- Java实现 LeetCode 831 隐藏个人信息(暴力)
831. 隐藏个人信息 给你一条个人信息字符串 S,它可能是一个 邮箱地址 ,也可能是一串 电话号码 . 我们将隐藏它的隐私信息,通过如下规则: 电子邮箱 定义名称 name 是长度大于等于 2 (l ...
- Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)
827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...
- Java实现 LeetCode 825 适龄的朋友(暴力)
825. 适龄的朋友 人们会互相发送好友请求,现在给定一个包含有他们年龄的数组,ages[i] 表示第 i 个人的年龄. 当满足以下条件时,A 不能给 B(A.B不为同一人)发送好友请求: age[B ...
- Java实现 LeetCode 822 翻转卡片游戏(暴力)
822. 翻转卡片游戏 在桌子上有 N 张卡片,每张卡片的正面和背面都写着一个正数(正面与背面上的数有可能不一样). 我们可以先翻转任意张卡片,然后选择其中一张卡片. 如果选中的那张卡片背面的数字 X ...
- Java实现 LeetCode 821 字符的最短距离(暴力)
821. 字符的最短距离 给定一个字符串 S 和一个字符 C.返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组. 示例 1: 输入: S = "loveleet ...
- Java实现 LeetCode 820 单词的压缩编码(暴力)
820. 单词的压缩编码 给定一个单词列表,我们将这个列表编码成一个索引字符串 S 与一个索引列表 A. 例如,如果这个列表是 ["time", "me", & ...
随机推荐
- Excel心得
智能表.数据透视表.分类汇总表是Excel最值得学的技能. 通过插入表,或者快捷键Ctrl+T/Ctrl+L,可以将区域转换为智能表,保证了字段的公式的统一,而且版式自动化处理,一深一浅.Ctrl+Q ...
- python之导入模块的方法
一.导入标准库模块 1.第一种方式: 可以通过以下方法导入 import time 当使用时间模块的sleep方法时可以使用 time.sleep(2) 2.第二种方式: 当只想使用sleep函数时, ...
- springBoot整合Mybatis,Junit
笔记源码:https://gitee.com/ytfs-dtx/SpringBoot 整合Mybatis SpringBoot的版本:2.2.5.RELEASE Mybatis版本:mybatis-s ...
- 【前端背景UI】鼠标磁性动态蜘蛛网背景源码
<div style="float:right;" id="hub_iframe"></div> <script type=&qu ...
- 简单而面试中又常见的知识点:JS执行机制
在开始讲解之前,我们先来看一段代码: console.log('1'); setTimeout(function() { console.log('2'); process.nextTick( ...
- css实现双色饼图
from:wx--前端早读课 首先回想用css画三角形的方法: <div class="triangle"></div> .triangle { displ ...
- hdu3397 Sequence operation 线段树
hdu3397 Sequence operation #include <bits/stdc++.h> using namespace std; ; struct node { /// l ...
- elment新增el-select的全选功能
不废话,效果如图 代码实现 平生不爱啰嗦,功能如上已实现.
- Python3高级核心技术97讲
可以毫不夸张的说:这门课程是初中级Python开发人员向高级进阶的必学课程 许多Pythoner喜欢追求新的框架,但却不重视Python本身基础知识的学习, 他们不知道的是,语言本身的进阶优先于框架, ...
- 加密通信软件Signal 2.92版本编译安装折腾手记(Ubuntu 18.04)
加密通信软件Signal 2.92版本编译安装折腾手记(Ubuntu 18.04) 前言 加密通信软件Signal是开源的,安全性很高,号称斯诺登也推荐大家使用.既然这么好,那必然会有不少人去尝试复制 ...