Sweep Line
391. Number of Airplanes in the Sky
https://www.lintcode.com/problem/number-of-airplanes-in-the-sky/description?_from=ladder&&fromId=4
思路:将起飞时间和降落时间放到同一个数组中, 标识出是起飞还是降落时间, 然后对数组排序,遍历数组即可, 碰到起飞计数器加一, 碰到降落计数器减一. 维护最大值作为答案.
注意降落优先于起飞 可通过flag标记降落为0 上升为1,保证按time相等按flag排序降落为先
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/ class Point{
int time;
int flag; Point(int t, int s) {
this.time = t;
this.flag = s;
}
public static Comparator<Point> PointComparator = new Comparator<Point>() {
public int compare(Point p1, Point p2) {
if(p1.time == p2.time)
return p1.flag - p2.flag;
else
return p1.time - p2.time;
}
};
} public class Solution {
/**
* @param airplanes: An interval array
* @return: Count of airplanes are in the sky.
*/
public int countOfAirplanes(List<Interval> airplanes) {
// write your code here
List<Point> list = new ArrayList<>(airplanes.size()*2);
for(Interval i:airplanes){
list.add(new Point(i.start,1));
list.add(new Point(i.end,-1));
} Collections.sort(list,Point.PointComparator);
int count=0,ans =1;
for(Point p:list){
if(p.flag==1)
count++;
else
count--; ans = Math.max(ans,count);
} return ans; }
}
919. Meeting Rooms II
https://www.lintcode.com/problem/meeting-rooms-ii/description?_from=ladder&&fromId=4
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
class Meeting{
int time;
int flag;
public Meeting(int time,int flag){
this.time = time;
this.flag = flag;
} public static Comparator<Meeting> comparator = new Comparator<Meeting>(){
@Override
public int compare(Meeting m1, Meeting m2){
if(m1.time==m2.time){
return m1.flag - m2.flag;
}
return m1.time-m2.time;
}
};
}
public class Solution {
/**
* @param intervals: an array of meeting time intervals
* @return: the minimum number of conference rooms required
*/
public int minMeetingRooms(List<Interval> intervals) {
// Write your code here
if(intervals == null || intervals.size()==0){
return 0;
} List<Meeting> meetings = new ArrayList<>();
for(Interval i:intervals){
meetings.add(new Meeting(i.start,1));
meetings.add(new Meeting(i.end,-1));
} Collections.sort(meetings,Meeting.comparator); int count =0;
int ans =0;
for(Meeting m:meetings){
if(m.flag==1){
count++;
} if(m.flag==-1){
count--;
} ans = Math.max(ans,count);
} return ans;
}
}
821. Time Intersection
https://www.lintcode.com/problem/time-intersection/description?_from=ladder&&fromId=4
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
class Point{
int time;
int flag; Point(int t, int s) {
this.time = t;
this.flag = s;
}
public static Comparator<Point> PointComparator = new Comparator<Point>() {
public int compare(Point p1, Point p2) {
if(p1.time == p2.time)
return p1.flag - p2.flag;
else
return p1.time - p2.time;
}
};
} public class Solution {
/**
* @param seqA: the list of intervals
* @param seqB: the list of intervals
* @return: the time periods
*/
public List<Interval> timeIntersection(List<Interval> seqA, List<Interval> seqB) {
// Write your code here
List<Interval> res = new ArrayList<>();
if(seqA==null || seqB==null){
return res;
} List<Point> list = new ArrayList<>();
for(Interval i:seqA){
list.add(new Point(i.start,1));
list.add(new Point(i.end,-1));
} for(Interval i:seqB){
list.add(new Point(i.start,1));
list.add(new Point(i.end,-1));
} Collections.sort(list,Point.PointComparator); int start =-1;
int count=0;
for(Point p:list){
if(p.flag==1)
count++;
else
count--; if(count==2){
start = p.time;
} if(count==1 && start!=-1){
res.add(new Interval(start,p.time));
start = -1;
}
} return res;
}
}
131. The Skyline Problem
https://www.lintcode.com/problem/the-skyline-problem/description?_from=ladder&&fromId=4
class Pair implements Comparable{
int index; //坐标
int status; //是up还是down
int height; //高度 Pair(int index,int status,int height){
this.index = index;
this.status = status;
this.height = height;
} //先按坐标,再按status,再按高度
public int compareTo(Object o){
Pair p = (Pair)o;
if(this.index==p.index){
if(this.status==p.status){
return this.height - p.height;
}else{
return this.status - p.status;
}
}else{
return this.index- p.index;
}
} }
public class Solution {
/**
* @param buildings: A list of lists of integers
* @return: Find the outline of those buildings
*/
private static int UP = 0;
private static int DOWN = 1;
public List<List<Integer>> buildingOutline(int[][] buildings) {
// write your code here
List<List<Integer>> res = new ArrayList<>();
if(buildings ==null || buildings.length==0||buildings[0].length==0){
return res;
} List<Pair> pairs = new ArrayList<>();
for(int i=0;i< buildings.length;i++){
pairs.add(new Pair(buildings[i][0],UP,buildings[i][2]));
pairs.add(new Pair(buildings[i][1],DOWN,buildings[i][2]));
} Collections.sort(pairs); TreeMap<Integer,Integer> heightMap = new TreeMap<>(); int preIndex =0;
int preHeight =0;
for(Pair pair:pairs){
if(!heightMap.containsKey(pair.height)){
heightMap.put(pair.height,1);
}else{
if(pair.status==UP){
heightMap.put(pair.height,heightMap.get(pair.height)+1);
}else{
heightMap.put(pair.height,heightMap.get(pair.height)-1);
if(heightMap.get(pair.height)==0){
heightMap.remove(pair.height);
}
}
} int currHeight = heightMap.size()==0?0:heightMap.lastKey(); if(preHeight!=currHeight){
if(preHeight!=0 && preIndex!=pair.index){
res.add(eachSkyLine(preIndex,pair.index,preHeight));
} preHeight = currHeight;
preIndex = pair.index;
}
} return res; } private List<Integer> eachSkyLine(int start,int end,int height){
List<Integer> list = new ArrayList<>();
list.add(start);
list.add(end);
list.add(height);
return list;
}
}
Sweep Line的更多相关文章
- sweep line-The Skyline Problem
2020-01-10 17:51:05 问题描述: 问题求解: 本题是经典的sweep line问题. 对于sweep line问题我们需要考虑的只有两点: 1. 延水平方向 / 时间方向 :时间队列 ...
- Leetcode: Find Right Interval
Given a set of intervals, for each of the interval i, check if there exists an interval j whose star ...
- [算法]Comparison of the different algorithms for Polygon Boolean operations
Comparison of the different algorithms for Polygon Boolean operations. Michael Leonov 1998 http://w ...
- 218. The Skyline Problem *HARD* -- 矩形重叠
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- Poly2Tri介绍[转]
https://blog.csdn.net/xys206006/article/details/83002326 这是Poly2Tri介绍的翻译博文.原文链接:http://sites-final.u ...
- Java Algorithm Problems
Java Algorithm Problems 程序员的一天 从开始这个Github已经有将近两年时间, 很高兴这个repo可以帮到有需要的人. 我一直认为, 知识本身是无价的, 因此每逢闲暇, 我就 ...
- Voronoi Diagram——维诺图
Voronoi图定义 任意两点p 和q 之间的欧氏距离,记作 dist(p, q) .就平面情况而言,我们有 dist(p, q) = (px-qx)2+ (py-qy)2 ...
- 【LeetCode】二叉查找树 binary search tree(共14题)
链接:https://leetcode.com/tag/binary-search-tree/ [220]Contains Duplicate III (2019年4月20日) (好题) Given ...
- BUAA软件工程_结对编程
1.写在前面 项目 内容 所属课程 2020春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...
随机推荐
- Markdown 手册
前言(可以不看) 最开始只是想写一篇博文,准备使用markdown,感觉很流行(github.简书……很多都支持),而且渲染出来很好看,一直很想学,没有合适的机会,结果拖到了现在.比起什么python ...
- openssl生成ssl证书(转)
原文:http://blog.sina.com.cn/s/blog_4fd50c390101891c.html x509证书一般会用到三类文,key,csr,crt. Key 是私用密钥openssl ...
- ubuntu解压文件命令大全
ubuntu 下rar解压工具安装方法: 压缩功能 安装 sudo apt-get install rar 卸载 sudo apt-get remove rar 解压功能 安装 sudo apt-ge ...
- Template Method Design Pattern in Java
Template Method is a behavioral design pattern and it’s used to create a method stub and deferring s ...
- Android-Camera+SurfaceView
Camera相机是属于硬件,每台设备的Camera硬件配置的参数都是不一样的,Camera通常是用来拍照,扫描二维码等等 AndroidManifest.xml配置Camera需要的权限: <! ...
- Python入门基础学习 一
Python入门基础学习 一 Python下载及安装 下载地址:https://www.python.org/,选择最新的版本下载 稍等一会,安装完成. 简单语句 从idle启动Python:IDLE ...
- Hadoop集群 -Eclipse开发环境设置
1.Hadoop开发环境简介 1.1 Hadoop集群简介 Java版本:jdk-6u31-linux-i586.bin Linux系统:CentOS6.0 Hadoop版本:hadoop-1.0.0 ...
- pssh执行本地文件(脚本)
场景:目标命令中含有特殊符号,导致pssh批量执行可能出问题. 用法: pssh -h RemoteHosts.ip -P -I < ~/LocalScript.sh
- 随手记录: MVC自定义提交form
function mySubmit() { var frm = $('#frm'); var result = frm.valid(); if (ret) { frm.submit(); } else ...
- ASP.NET IIS 支持PUT、DELETE请求
IIS 本身不支持PUT.DELETE请求,但可以通过一下方法修改进而达到目的 删除IIS安装的WebDav模块,选择你的项目,右边有个“模块”,双击它:找到WebDavModule,删除它(不推荐, ...