java人员安排表_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 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的动态语句

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值