【线段树】【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] .根 ...
随机推荐
- 京豆薅羊毛新姿势-docker方式
背景 上周看脉脉的时候看到下面这个帖子,领导让搞项目容器化,但是楼主没搞过,对新东西有畏惧感,怂了,然后把机会白白送给其他同事了. 想来我也是差不多这样的,刚到阿里工作的时候,有个好的项目机会来了,领 ...
- SESSION会话机制解析
Windows Session(会话)的概念 会话 session 是由代表单个用户登录会话的所有进程和系统对象组成的.其中的对象包括所有的窗口,桌面和windows stations.桌面是特定se ...
- DNS子域委派配置·
实验介绍:DNS子域委派的作用 子域即为主域下的一个子域名,当一个子域的流量过大时,主域的DNS服务器可以把一个子域的查询授权给一台专门的子域服务器 注意被委派的服务器必须是委派服务器的子域服务器. ...
- Java集合篇之set,面试官:请说一说HashSet、LinkedHashSet、TreeSet的区别?
写在开头 Java的集合世界中主要由List,Set,Queue,Map构成,我们在之前的博文中已经学习了List,接下来我们继续学习Set集合. Set特点:存取无序,不可以存放重复的元素,不可以用 ...
- ESP8266 ESP-01S模块使用及AT命令
ESP-01S PIN定义 工作时连线方法 ESP-01S USB2TTL/MCU GND GND TX(GPIO1) RX RX(GPIO3) TX 3.3V 3.3V 相关文件下载 固件及烧录软件 ...
- 发布Npm包到GitHub Packages
发布Npm包到GitHub Packages Github集成了GitHub Packages功能,目前提供了Npm.Docker.Maven.NuGet.RubyGems的包管理工具,可以通过Git ...
- python3 pip3 安装python-ldap失败
pip3安装时提示 ERROR: Could not build wheels for python-ldap, uWSGI, M2Crypto, which is required to insta ...
- OpenCV开发笔记(五十八):红胖子8分钟带你深入了解图像的矩(图文并茂+浅显易懂+程序源码)
若该文为原创文章,未经允许不得转载原博主博客地址:https://blog.csdn.net/qq21497936原博主博客导航:https://blog.csdn.net/qq21497936/ar ...
- requests请求超时尝试重连的3种方式
参考文档 https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#module-urllib3.util.retry ...
- MySQL和Redis基本安装和配置
MySQL 下载和安装 mysql官网下载:https://dev.mysql.com/downloads/mysql/ 下载后将目录下的bin路径加入到环境变量中 在安装目录下创建 my.ini 配 ...