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】的更多相关文章

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

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

  2. 【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)

    第一部分---线段树:https://leetcode.com/tag/segment-tree/ [218]The Skyline Problem [307]Range Sum Query - Mu ...

  3. C#LeetCode刷题-线段树

    线段树篇 # 题名 刷题 通过率 难度 218 天际线问题   32.7% 困难 307 区域和检索 - 数组可修改   42.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 4 ...

  4. leetcode 699. Falling Squares 线段树的实现

    线段树实现.很多细节值得品味 都在注释里面了 class SegTree: def __init__(self,N,query_fn,update_fn): self.tree=[0]*(2*N+2) ...

  5. 线段树(Segment Tree)(转)

    原文链接:线段树(Segment Tree) 1.概述 线段树,也叫区间树,是一个完全二叉树,它在各个节点保存一条线段(即“子数组”),因而常用于解决数列维护问题,基本能保证每个操作的复杂度为O(lg ...

  6. segment树(线段树)

    线段树(segment tree)是一种Binary Search Tree或者叫做ordered binary tree.对于线段树中的每一个非叶子节点[a,b],它的左子树表示的区间为[a,(a+ ...

  7. 最大子序和:暴力->递归->动规->线段树

    题目描述 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. LeetCode:53. 最大子序和 题解 显而易见的暴力解法 最容易想到的便是暴力穷 ...

  8. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  9. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  10. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

随机推荐

  1. VSCode实现GDB图形界面远程调试

    前言 在习惯了集成开发环境的图形界面调试时,首次使用GDB远程调试必定很不习惯,下面讲述如何利用VSCode实现GDB图形界面远程调试 代码在Linux服务器上,而平常都在Windows上使用,那么V ...

  2. 云计算 - 对象存储服务OSS技术全解

    本文全面深入地探讨了对象存储服务(OSS)的核心技术.基础知识和高级功能.从媒体存储到数据备份,再到数据仓库与数据湖,我们不仅解析了OSS在各种应用场景下的关键角色,还深入讨论了其与机器学习.多媒体处 ...

  3. 探索Web API SpeechSynthesis:给你的网页增添声音

    Web API SpeechSynthesis是一项强大的浏览器功能,它允许开发者将文本转换为语音,并通过浏览器播放出来.本文将深入探讨SpeechSynthesis的控制接口,包括其功能.用法和一个 ...

  4. 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 ...

  5. java处理json类型数据--阿里巴巴fastjson api常用方法实战

    fastjson介绍 最近工作上经常需要解析json类型数据以及java对象到json类型的互转,特地研究了下阿里巴巴的fastjson,这个是国内用的 比较多的json转换api,还有其他的入jac ...

  6. letcode-两数相除

    题解 设未知数: Br= 125 / 3,拆进行如下拆解: Br = 125 / 3 Br = (29 + 96)/3 Br = 29/3 + (32 * 3) / 3 Br = 29/3 + (2 ...

  7. 我的小程序之旅七:微信公众号设置IP白名单

    一.为什么要配置IP白名单 此处IP为服务器对公网IP: 在IP白名单内的IP地址作为来源,获取access_token接口才可调用成功. 而想要调用公众号相关API,就必须获取access_toke ...

  8. win32 - WriteProcessMemory的使用

    使用这个api可以在指定的进程中将数据写入内存区域. 注意:以管理员权限运行,并且以x64调试. #include <windows.h> #include <iostream> ...

  9. 使用Java线程同步工具类CyclicBarrier

    如何使用 java.util.concurrent.CyclicBarrier是Java并发并发编程中的线程同步工具类,基于java.util.concurrent.locks.ReentrantLo ...

  10. 关于“非法的前向引用(illegal forward reference)”的探究

    1.问题: 有如下代码: public class Test { static { i = 0;// 给变量赋值可以正常编译通过 System.out.print(i);// 编译器会提示" ...