扫描线算法(天际线问题)
Posted 秦枫-_-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了扫描线算法(天际线问题)相关的知识,希望对你有一定的参考价值。
扫描线的核心在于 将不规则的形状按照水平或者垂直的方式,划分成若干个规则的矩形。
class Solution {
public List<List<Integer>> getSkyline(int[][] buildings) {
List<List<Integer>> ans=new ArrayList<>();
List<int []>bu=new ArrayList<int []>();
for(int []ch:buildings){
bu.add(new int[]{ch[0],-ch[2]});
bu.add(new int[]{ch[1],ch[2]});
}
Collections.sort(bu,(a,b)->{
if(a[0]!=b[0])return a[0]-b[0];
else return a[1]-b[1];
}
);
PriorityQueue<Integer> q=new PriorityQueue<>((a,b)->{return b-a;});
q.add(0);
int prev=0;
for(int i=0;i<bu.size();i++){
int axis=bu.get(i)[0],height=bu.get(i)[1];
if(height<0)q.add(-height);
else q.remove(height);
int cur=q.peek();
if(cur!=prev){
List<Integer> lis=new ArrayList<>();
lis.add(axis);
lis.add(cur);
prev=cur;
ans.add(lis);
}
}
return ans;
}
}
以上是关于扫描线算法(天际线问题)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 218. 天际线问题(扫描线)/ 1818. 绝对差值和/ 1846. 减小和重新排列数组后的最大元素