218. 天际线问题
作者:互联网
题解:
1、难度较大 使用优先队列求解 关键点在于
1 按x轴顺序加入优先队列 如果x轴相同 则 将起点先加入队列
2 遇到起点时加入 遇到终点时将属于终点的起点从优先队列中剔除
3 每次判断peek()出来的高度是否变化 若发生改变则加入结果集中
class Solution {
public List<List<Integer>> getSkyline(int[][] buildings) {
List<List<Integer>> result = new ArrayList<>();
List<int[]> height = new ArrayList<>();
for(int[] b:buildings) {
height.add(new int[]{b[0], -b[2]});
height.add(new int[]{b[1], b[2]});
}
Collections.sort(height, (a, b) -> {
if(a[0] != b[0])
return a[0] - b[0];
return a[1] - b[1];
});
Queue<Integer> pq = new PriorityQueue<>((a, b) -> (b - a));
pq.offer(0);
int prev = 0;
for(int[] h:height) {
if(h[1] < 0) {
pq.offer(-h[1]);
} else {
pq.remove(h[1]);
}
int cur = pq.peek();
if(prev != cur) {
result.add(
new ArrayList<>() {{add(0,h[0]);add(1,cur);}
});
prev = cur;
}
}
return result;
}
}
标签:pq,cur,天际线,int,218,height,问题,add,new 来源: https://www.cnblogs.com/linyxBlog/p/14223448.html