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 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 731 我的日程安排表 II(二叉树)

731. 我的日程安排表 II 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内不会导致三重预订时,则可以存储这个新的日程安排. MyCalendar 有一个 book(int ...

Java实现 LeetCode 729 我的日程安排表 I(二叉树)

729. 我的日程安排表 I 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安排. MyCalendar 有一个 book(int sta ...

Java实现 LeetCode 220 存在重复元素 III&lpar;三&rpar;

220. 存在重复元素 III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最 ...

Java实现 LeetCode 831 隐藏个人信息(暴力)

831. 隐藏个人信息 给你一条个人信息字符串 S,它可能是一个 邮箱地址 ,也可能是一串 电话号码 . 我们将隐藏它的隐私信息,通过如下规则: 电子邮箱 定义名称 name 是长度大于等于 2 (l ...

Java实现 LeetCode 827 最大人工岛(DFS&plus;暴力模拟)

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", & ...

随机推荐

CSS3实现加载中效果

代码:

Android开发(二十七)——android&colon;layout&lowbar;weight的真实含义

android:layout_weight的真实含义是:一旦View设置了该属性(假设有效的情况下),那么该 View的宽度等于原有宽度(android:layout_width)加上剩余空间的占比! ...

【Android Demo】通过WebService获取今日天气情况

因为本身是在搞.NET方面的东东,现在在学习Android,所以想实现Android通过WebService接口来获取数据,网上很多例子还有有问题的.参考:Android 通过WebService进行 ...

javascript实现URL不缓存的方法

jQuery EasyUI parser 的使用场景

转自原文地址:http://www.easyui.info/archives/216.html parser,故名意思,就是解析器的意思,别看他只有那么几行代码,jQuery Easyui 能够根据c ...

Vmware 中安装 Ubuntu Server &lpar;或者ubuntu 以文本界面登陆时&rpar; 分辨率无法全屏问题

Vmware 中安装 Ubuntu Server/Ubuntu 分辨率,无法全屏问题 需要更改grub设置 在终端或者文本界面按下列步骤进行设置: 第一步: 输入命令 sudo vim /etc/de ...

How To&colon;禁用ubuntu全局菜单&lpar;global menu&rpar;的方法

刚从windows转过来的新手可用会觉得ubuntu unity下的全局菜单(global menu)用起来很不方便.下边是介绍去除全局菜单的方法 1.打开终端(可以去dash主页里面搜,也可以直接按 ...

js文字滚动效果

function (global) { var logo = document.getElementById('logo'); var text = document.createTextNode(' ...

mybaits动态SQL中的DECIMAL

数据库:mysql数据库字段类型:decimal(11,2)java程序类型:java.math.BigDecimal 使用mybatis的动态语句

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

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

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

  2. [LeetCode]732. 我的日程安排表 III

    题目 732. 我的日程安排表 III 732. 我的日程安排表 III 当 k 个日程安排有一些时间上的交叉时(例如 k 个日程安排都在同一时间内),就会产生 k 次预订.给你一些日程安排 [sta ...

  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. 【JAVA】【刷题子】732. 我的日程安排表

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

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

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

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

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

  8. java utf-8字符表_Java中的ASCII、Unicode和UTF-8字符编码集

    首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态 ...

  9. java错误信息表_java报表

    java报表``` java报表``` 请问一些关于报表的考察代码````请``各位英雄``相助```谢谢搜索更多相关的解决方案: java"target="_blank" ...

最新文章

  1. Linux下安装Tomcat
  2. XVII Open Cup named after E.V. Pankratiev. GP of Tatarstan
  3. java中生成不重复随机的数字
  4. 鸟哥linux私房菜 之 老段带你学习linux
  5. 世纪互联云和华为共同打造的数据中心是一个很好的一步标志!
  6. CSS设计指南(第3版)
  7. Topaz DeNoise AI for Mac(图片降噪软件)
  8. java对象值传递和对象传递的总结
  9. linux如何跳到命令行开端,Linux快捷键大全
  10. 关于php后台的知识,xfplay影音先锋画面声音不同步的处理教程 爱狐网 (‾◡◝)...
  11. MacBook安装wget几种方式
  12. RS485串口模块详解RS232、RS485、RS485
  13. word自己新建样式,怎么加入目录?
  14. Python 中那些令人防不胜防的坑(一)
  15. 至于你信不信,反正我信了
  16. linux环境vmd安装,Ubuntu下VMD安装
  17. Phalcon PHP 中文,Phalcon 入门
  18. 电信机顶盒时中心服务器异常,电信机顶盒常见故障汇总大全
  19. CVE和CWE的区别
  20. 2020年郑州大学计算机录取分数线,211双一流大学 郑州大学2020年各省各专业录取分数线...

热门文章

  1. 漫谈linux文件io,Linux文件IO与通用块层的请求合并
  2. 项目的行政收尾工作主要有哪些
  3. 国内外IP线路测试网址收藏
  4. linux 网卡流量脚本,实时查看Linux网卡流量的shell脚本分享(图文)
  5. python学习(三):web网页框架Django,成就python全栈开发
  6. 【linux】linux基础命令-chage详解
  7. 怎么查看电脑的S/N序列号
  8. 2023年web安全最全学习路线,从入门到入职(含书籍、工具包)
  9. creo 计算机配置,config配置文件乱码,creo配置文件config
  10. LINUX下ThinkPad指点杆设置