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春季计算机学院软件工程(罗杰 任健) (北航) 作业要求 结对项目作业 课程目标 培养软件开发能力 本作业对实现目标的具体作用 培养结对编程开发项目的能力 ...
随机推荐
- Linux设备驱动模型底层架构及组织方式
1.什么是设备驱动模型? 设备驱动模型,说实话这个概念真的不好解释,他是一个比较抽象的概念,我在网上也是没有找到关于设备驱动模型的一个定义,那么今天就我所学.所了解 到的,我对设备驱动模型的一个理解: ...
- D3 datum()
datum()和data()功能类似. datum():将指定数据赋值给被选择元素.data():将数据数组与选择集的元素结合. var p = d3.selectAll('p'); p.datum( ...
- 结对项目— 词频统计(语言C++)
结对对象:季天梦 博客地址:http://www.cnblogs.com/jitianmeng/ github链接:https://github.com/liuyutianlyt/EX_4.md 比例 ...
- 使用C语言实现线性表
线性表是最常用且最简单的一种数据结构.一个线性表是n个数据元素的有限序列,序列中的每个数据元素,可以是一个数字,可以是一个字符,也可以是复杂的结构体或对象.例如:1,2,3,4,5是一个线性表,A,B ...
- windows服务安装记录
首先打开cmd. 进入这个地址 C:\Windows\Microsoft.NET\Framework\v4.0.30319 执行操作 InstallUtil.exe E:\QueueWinServi ...
- .Net Core 2.0 的 ConsoleApp 搭建 Quartz(xml配置)windows服务
零.创建一个.Net Core 2.0 的ConsoleApp 应用,建完就是这个样子了. 添加Log4Net 的引用,(不想看可以不看,个人习惯)Install-Package log4net添加C ...
- 【总结】 BZOJ1000~1099板刷计划
Tham又布置了一大堆题目,但是因为我TCL完全不会做,所以只能切切BZOJ的题目,划划水,要不是xz的面子大,我就已经被赶出了CJ信息组了QwQ(聂已己是神仙!) 1000 A+B这种入门题就不用写 ...
- Android : M 与 N 的权限管理
从 M 开始,permission 分为 Normal permission Runtime permission Normal permission 直接在 manifest 里声明就可以用了. a ...
- iOS AppStore 被拒原因
De : Apple 3.12 - Apps should have all included URLs fully functional when you submit it for review, ...
- Android 的学习心得
https://www.jianshu.com/p/f93a6c75940c 一个2年安卓开发者的一些经验分享