【线段树】【leetcode 729. 我的日程安排表 I】
class MyCalendar {
class Seg {
int l;
int r;
boolean val;
Seg left;
Seg right;
public Seg(int x, int y) {
this.l = x;
this.r = y;
this.val = false;
this.left = null;
this.right = null;
}
public boolean exist(int left, int right) {
if(this.val){
return true;
}
int mid = (this.l + this.r) / 2;
if (left > mid) {
if (this.right != null) {
return this.right.exist(left, right);
}
return false;
} else if (right <= mid) {
if (this.left != null) {
return this.left.exist(left, right);
}
return false;
} else {
boolean exist = false;
if (this.left != null) {
exist = this.left.exist(left, mid);
}
if (this.right != null) {
exist = exist | this.right.exist(mid + 1, right);
}
return exist;
}
}
public void insert(int start, int end) {
if (start <= this.l && this.r <= end) {
this.val = true;
return;
}
int mid = (this.l + this.r) / 2;
if (start > mid) {
if (this.right == null) {
this.right = new Seg(mid + 1, this.r);
}
this.right.insert(start, end);
} else if (end <= mid) {
if (this.left == null) {
this.left = new Seg(this.l, mid);
}
this.left.insert(start, end);
} else {
if (this.right == null) {
this.right = new Seg(mid + 1, this.r);
}
if (this.left == null) {
this.left = new Seg(this.l, mid);
}
this.right.insert(mid + 1, end);
this.left.insert(start, mid);
}
}
}
Seg root = null;
public MyCalendar() {
root = new Seg(0, 1000_000_000);
}
public boolean book(int start, int end) {
if (root.exist(start, end-1)) {
return false;
}
root.insert(start, end-1);
return true;
}
public static void main(String[] args) {
MyCalendar calendar = new MyCalendar();
System.out.println(calendar.book(47,50));
System.out.println(calendar.book(15,25));
System.out.println(calendar.book(20,30));
}
}
/**
* Your MyCalendar object will be instantiated and called as such:
* MyCalendar obj = new MyCalendar();
* boolean param_1 = obj.book(start,end);
*/
【线段树】【leetcode 729. 我的日程安排表 I】的更多相关文章
- Java实现 LeetCode 729 我的日程安排表 I(二叉树)
729. 我的日程安排表 I 实现一个 MyCalendar 类来存放你的日程安排.如果要添加的时间内没有其他安排,则可以存储这个新的日程安排. MyCalendar 有一个 book(int sta ...
- 【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)
第一部分---线段树:https://leetcode.com/tag/segment-tree/ [218]The Skyline Problem [307]Range Sum Query - Mu ...
- C#LeetCode刷题-线段树
线段树篇 # 题名 刷题 通过率 难度 218 天际线问题 32.7% 困难 307 区域和检索 - 数组可修改 42.3% 中等 315 计算右侧小于当前元素的个数 31.9% 困难 4 ...
- leetcode 699. Falling Squares 线段树的实现
线段树实现.很多细节值得品味 都在注释里面了 class SegTree: def __init__(self,N,query_fn,update_fn): self.tree=[0]*(2*N+2) ...
- 线段树(Segment Tree)(转)
原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...
- segment树(线段树)
线段树(segment tree)是一种Binary Search Tree或者叫做ordered binary tree.对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+ ...
- 最大子序和:暴力->递归->动规->线段树
题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode:53. 最大子序和 题解 显而易见的暴力解法 最容易想到的便是暴力穷 ...
- bzoj3932--可持久化线段树
题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...
- codevs 1082 线段树练习 3(区间维护)
codevs 1082 线段树练习 3 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...
- codevs 1576 最长上升子序列的线段树优化
题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...
随机推荐
- VSCode实现GDB图形界面远程调试
前言 在习惯了集成开发环境的图形界面调试时,首次使用GDB远程调试必定很不习惯,下面讲述如何利用VSCode实现GDB图形界面远程调试 代码在Linux服务器上,而平常都在Windows上使用,那么V ...
- 云计算 - 对象存储服务OSS技术全解
本文全面深入地探讨了对象存储服务(OSS)的核心技术.基础知识和高级功能.从媒体存储到数据备份,再到数据仓库与数据湖,我们不仅解析了OSS在各种应用场景下的关键角色,还深入讨论了其与机器学习.多媒体处 ...
- 探索Web API SpeechSynthesis:给你的网页增添声音
Web API SpeechSynthesis是一项强大的浏览器功能,它允许开发者将文本转换为语音,并通过浏览器播放出来.本文将深入探讨SpeechSynthesis的控制接口,包括其功能.用法和一个 ...
- NC25064 [USACO 2007 Mar G]Ranking the Cows
题目链接 题目 题目描述 Each of Farmer John's N cows (1 ≤ N ≤ 1,000) produces milk at a different positive rate ...
- java处理json类型数据--阿里巴巴fastjson api常用方法实战
fastjson介绍 最近工作上经常需要解析json类型数据以及java对象到json类型的互转,特地研究了下阿里巴巴的fastjson,这个是国内用的 比较多的json转换api,还有其他的入jac ...
- letcode-两数相除
题解 设未知数: Br= 125 / 3,拆进行如下拆解: Br = 125 / 3 Br = (29 + 96)/3 Br = 29/3 + (32 * 3) / 3 Br = 29/3 + (2 ...
- 我的小程序之旅七:微信公众号设置IP白名单
一.为什么要配置IP白名单 此处IP为服务器对公网IP: 在IP白名单内的IP地址作为来源,获取access_token接口才可调用成功. 而想要调用公众号相关API,就必须获取access_toke ...
- win32 - WriteProcessMemory的使用
使用这个api可以在指定的进程中将数据写入内存区域. 注意:以管理员权限运行,并且以x64调试. #include <windows.h> #include <iostream> ...
- 使用Java线程同步工具类CyclicBarrier
如何使用 java.util.concurrent.CyclicBarrier是Java并发并发编程中的线程同步工具类,基于java.util.concurrent.locks.ReentrantLo ...
- 关于“非法的前向引用(illegal forward reference)”的探究
1.问题: 有如下代码: public class Test { static { i = 0;// 给变量赋值可以正常编译通过 System.out.print(i);// 编译器会提示" ...