leetcode 729

给定一堆线段,每个线段都有一个起点、一个终点,用数组[(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中的平衡树的更多相关文章

  1. java中的锁

    java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...

  2. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. java中Action层、Service层和Dao层的功能区分

    Action/Service/DAO简介: Action是管理业务(Service)调度和管理跳转的. Service是管理具体的功能的. Action只负责管理,而Service负责实施. DAO只 ...

  5. Java中常用集合操作

    一.Map 名值对存储的. 常用派生类HashMap类 添加: put(key,value)往集合里添加数据 删除: clear()删除所有 remove(key)清除单个,根据k来找 获取: siz ...

  6. java中的移位运算符:<<,>>,>>>总结

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...

  7. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  8. Java中的进程和线程

     Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...

  9. Java中的进程与线程(总结篇)

    详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...

随机推荐

  1. 【BZOJ】【1038】【ZJOI2008】瞭望塔

    计算几何/半平面交 说是半平面交,实际上只是维护了个下凸壳而已……同1007水平可见直线 对于每条线段,能看到这条线段的点都在这条线段的“上方”,那么对所有n-1条线段求一个可视区域的交,就是求一个半 ...

  2. iOS:UIView视图与组件控件

    一.UIView常见属性  (1)@property(nonatomic,readonly)UIView *superview; //获取自己的父控件对象  (2)@property(nonatomi ...

  3. Objective-C:MRC(引用计数器)在OC内部的可变对象是适用的,不可变对象是不适用的(例如 NSString、NSArray等)

    引用计数和字符串 内存中的常量字符串的空间分配与其他对象不同,他们没有引用计数机制 凡是自定义的对象都有引用计数机制: OC内部中对象分为可变对象(NSMutableString等)和不可变对象(NS ...

  4. Informatica 常用组件Lookup之一 概述

    转换类型:被动.已连接/未连接 在映射中使用查找转换以从平面文件或关系表.视图或同义词查找数据.您可以从 PowerCenter Client 和 PowerCenter Server 均连接至的任何 ...

  5. Python爬虫之selenium爬虫,模拟浏览器爬取天猫信息

    由于工作需要,需要提取到天猫400个指定商品页面中指定的信息,于是有了这个爬虫.这是一个使用 selenium 爬取天猫商品信息的爬虫,虽然功能单一,但是也算是 selenium 爬虫的基本用法了. ...

  6. Android导航抽屉-Navigation Drawer

    Google今年七月份的时候更新了他们的Google+应用,采用了新的导航方式并抛弃了navigationdrawer.一时之间,又引发了一系列关于NavigationDrawer利弊的讨论,不过对于 ...

  7. maven mvn Failed during checkstyle execution

    maven 命令默认强制使用checkstyle, 造成 命令运行失败 并报错: Failed during checkstyle execution 关闭checkstyle,命令如下: mvn [ ...

  8. ACM:图的BFS,走迷宫

    题目: 一个网格迷宫由n行m列的单元格组成,每一个单元格要么是空地(用1表示),要么是障碍物(用0来表示).你的任务是找一条从起点到终点的最短移动序列,当中UDLR分别表示往上.下.左.右移动到相邻单 ...

  9. LeetCode【7】.Reverse Integer--java实现

    Reverse Integer 题目要求:给定一个int 类型值,求值的反转,例如以下: Example1: x = 123, return 321      Example2: x = -123, ...

  10. 让你看不懂的swift语法

    一.Swift杂谈 Swift语法出来时间不长,网络上的各种教程已经铺天盖地,可是基本上全部的教程都是来自官方翻译. 从Swift出来到如今.每天都在学习Swift.以下给出个人感受 Swift中的非 ...