Java中的平衡树
给定一堆线段,每个线段都有一个起点、一个终点,用数组[(beg1,end1),(beg2,end2),(beg3,end3)......]来表示。可以提出以下问题:
- 这些线段是否有重合部分
- 这些线段的总长度是多少(多条线段重合部分只计算一次),这个问题相当于上面那个问题的加强版
如果一次性给定了这些线段,只需对这些线段进行排序即可O(nlog(n)),然后从左往右O(n)复杂度扫描一遍。
这道题要求在线算法。所以就需要对每条线段的start进行排序,当插入时,判断start的上界线段、下界线段是否可以容纳当前线段即可。如果用数组实现,每次插入需要O(n/2)的复杂度。如果用平衡树,每次插入需要O(log(n))的复杂度。
这种方法复杂度为O(Nlog(N))
import java.util.TreeMap;
class MyCalendar {
class Node {
int start;
int end;
Node(int start, int end) {
this.start = start;
this.end = end;
}
}
TreeMap<Integer, Node> a = new TreeMap<>();
public MyCalendar() {
a.put(-1, new Node(-1, 0));
a.put((int) (1e9 + 7), new Node((int) (1e9 + 7), (int) (1e9 + 8)));
}
public boolean book(int start, int end) {
Node floor = a.floorEntry(start).getValue();
Node ceil = a.ceilingEntry(start).getValue();
if (start >= floor.end && end <= ceil.start) {
a.put(start, new Node(start, end));
return true;
} else {
return false;
}
}
}
此题还有另一种方法
对于N条线段,每条线段左端点为+1,右端点为-1,从左往右扫描,初始时s=0,遇到左端点s就+1,遇到右端点s就-1,在这个过程中,s的值必然始终为0或者1。
这种方法复杂度为O(N*N),其中N为线段的个数。
这种方法很容易扩展到允许线段交叉2次的情况,只需要改一下从左往右扫描时允许的最大上界即可。题目链接。
class MyCalendar{
public:
map<int, int> delta;
bool book(int start, int end) {
delta[start]++;
delta[end]--;
int booked = 0;
for (auto &d : delta) {
booked += d.second;
if (booked ==2) {
delta[start]--;
delta[end]++;
return false;
}
}
return true;
}
};
最后补充一个小技巧:一维数轴上,如何判断两条线段相交?
问题可以转化为:一位数轴上,如何求两条线段公共部分的长度?
记线段1(a0,a1),线段2(b0,b1)
答案是:min(a1,b1)-max(a0,b0)
于是两条线段相交的充要条件是:min(a1,b1)>max(a0,b0)
Java中的平衡树的更多相关文章
- java中的锁
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- Java中的Socket的用法
Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...
- java中Action层、Service层和Dao层的功能区分
Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...
- Java中常用集合操作
一.Map 名值对存储的. 常用派生类HashMap类 添加: put(key,value)往集合里添加数据 删除: clear()删除所有 remove(key)清除单个,根据k来找 获取: siz ...
- java中的移位运算符:<<,>>,>>>总结
java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : 右移运算符,num >& ...
- 关于Java中进程和线程的详解
一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...
- Java中的进程和线程
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
- Java中的进程与线程(总结篇)
详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...
随机推荐
- 【BZOJ】【1923】【Sdoi2010】外星千足虫
高斯消元解Xor方程组 ZYF Orz 这题……不作死就不会死T^T,用bitset确实比较快,而且可以从string直接转成bitset(构造函数). 但问题是我把转过来以后的顺序搞反了……原本以为 ...
- Java – Top 5 Exception Handling Coding Practices to Avoid
This article represents top 5 coding practices related with Java exception handling that you may wan ...
- 第一章 HttpClient的使用
1.http协议(这一块儿有时间的话会做记录) 2.常用的两种RPC方式 基于http协议:HttpClient和JDK自己的Http操作类 基于TCP或UDP协议:mina2和netty(这一部分以 ...
- Tomcat发布Maven项目遇到异常:java.lang.OutOfMemoryError: PermGen space
前言: 本问题出现在tomcat 7发布 web3.0Maven项目的时候出现. 问题阐述: 异常:java.lang.OutOfMemoryError:PermGen space 解决如下: 1. ...
- Git 忽略规则 .gitignore文件 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 适配 通知 Notification 通知渠道 前台服务 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- STL List::sort() 解析
看侯捷翻译那本<STL源码剖析>中list内置sort的算法,书中注释说是quick sort,看了半天没看明白, template <class T, class Alloc> ...
- 宿主机为linux、windows分别实现VMware三种方式上网(转)
一.VMware三种方式工作原理1 Host-only连接方式 让虚机具有与宿主机不同的各自独立IP地址,但与宿主机位于不同网段,同时为宿主主机新增一个IP地址,且保证该IP地址与各虚机IP地址位于 ...
- Effective C++ 条款27
尽量少做转型动作 尽量少做转型动作有什么目的?非常明显无非就是提高程序的稳定性.提高程序的运行效率. 那么.有哪些转型方式?每种方式都有什么弱点? 这是我们本节学习的重点. C++有四种转型: con ...
- easyui combotree模糊查询
技术交流QQ群:15129679 让EasyUI的combobox和combotree同时支持自定义模糊查询,在不更改其他代码的情况下,添加以下代码就行了: /** * combobox和combot ...