其他分享
首页 > 其他分享> > 218. 天际线问题

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