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春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...
随机推荐
- 让Ubuntu使用阿里云国内源,解决下载速度慢问题。
阿里云镜像官方地址 http://mirrors.aliyun.com/ 找到最新源地址列表: http://www.linuxdiyf.com/linux/23163.html 软件包管理中心(推荐 ...
- IntelliJ IDEA包名在一行
1.导入项目必须正确 选择左上角File--->NEw---->Module from Existing Sources 2.根据路径找到项目,如果是maven项目需要找到其pom.xml ...
- UVa 11419 SAM I AM (最小覆盖数)
题意:给定一个 n * m 的矩阵,有一些格子有目标,每次可以消灭一行或者一列,问你最少要几次才能完成. 析:把 行看成 X,把列看成是 Y,每个目标都连一条线,那么就是一个二分图的最小覆盖数,这个答 ...
- (模拟)Arithmetic Sequence -- HDU -- 5400
链接: http://acm.hdu.edu.cn/showproblem.php?pid=5400 Time Limit: 4000/2000 MS (Java/Others) Memory ...
- D3 data()
与datum()的区别 假设要绑定的数组为[3,6,9],那么我们希望第一个p元素绑定3,第二个绑定6,第三个绑定9.这种情况就需要使用data()函数,如果使用datum(),则会将数组本身绑定到各 ...
- Java Float类型 减法运算时精度丢失问题
package test1; public class Test2 { /*** @param args*/public static void main(String[] args) { Flo ...
- 后台web请求代码(含https,json提交)
后台web请求 namespace XXXX.Utilites { using System; using System.Collections.Generic; using System.IO; u ...
- 报表导出jxls的使用笔记
基于poi的jxls工具的使用:1.依赖: <dependency> <groupId>org.jxls</groupId> <artifactId>j ...
- php数组转成php编程代码
将php数组转成可以在php上面运行的编程代码,支持一维及多维数组 <?php //一维数组 $test1 = array(1,2,3); //二维数组 $test2[0] = array( ' ...
- linux服务器下配置多tomcat
车辆交易用的系统模块,正在做.老板要看看,以便车城那边的人提出意见.于是在服务器上再次增加一个tomcat. 以前是配置过的,配置过程其实很简单,这次太大意了,找了半天问题. 首先是拷贝一个tomca ...