思路,想办法把这些点放到集合中,并根据高度进行判断,进行出队入队操作
遍历数组,把左边的点的坐标以及高度的负值放入大顶堆中,右边的点及其高度正值放入堆中,
由于左右边高度一致,所以可以通过这个特性找到以及放入堆中的左边得边,删掉它。就这样,如果高度发生改变,就记录当前高度,坐标,放入结果队列中。
class Solution {
public List<List<Integer>> getSkyline(int[][] buildings) {
List<List<Integer> > points = new ArrayList<>();
for(int[] b: buildings){
points.add(Arrays.asList(b[0],-b[2]));
points.add(Arrays.asList(b[1],b[2]));
}
points.sort(
(o1,o2) -> {
int x1 = o1.get(0) , y1 = o1.get(1);
int x2 = o2.get(0) , y2 = o2.get(1);
if(x1 != x2) return x1-x2;
else return y1-y2;
}
);
Queue<Integer> queue = new PriorityQueue<>((o1,o2)->o2-o1);
queue.offer(0);
int pre_high = 0;
List<List<Integer> > res = new ArrayList<>();
for(List<Integer> p : points){
int x = p.get(0);
int y = p.get(1);
if(y<0){
queue.offer(-y);
}
else queue.remove(y);
int now_high = queue.peek();
if(now_high != pre_high){
res.add(Arrays.asList(x,now_high));
pre_high = now_high;
}
}
return res;
}
}