美文网首页程序员
力扣 218 天际线

力扣 218 天际线

作者: zhaojinhui | 来源:发表于2020-10-30 08:42 被阅读0次

题意:给定一个大楼的坐标和高度,返回天际线坐标

思路:用队列遍历楼的左右边界,具体见注释

思想:队列

复杂度:时间O(n2),空间O(n2)

class Solution {
    public List<List<Integer>> getSkyline(int[][] buildings) {
        if(buildings.length == 0)
            return new ArrayList<List<Integer>>();
        List<int[]> list = new ArrayList();
        // 把building的左右边和高度加入list中,其中右边的高度可以设为负,用来区分左右
        for(int[] b: buildings) {
            int[] left = {b[0], b[2]};
            int[] right = {b[1], 0 - b[2]};
            list.add(left);
            list.add(right);
        }
        // 把点排序,左边的点靠前,如果左边的点相等,那么高度小的靠前
        Collections.sort(list, new Comparator<int[]>(){
            public int compare(int[] n1, int[] n2) {
                if(n1[0] == n2[0])
                    return n2[1] - n1[1];
                return n1[0] - n2[0];
            }
        });
        // 按照高度从大到小排序
        PriorityQueue<Integer> pq = new PriorityQueue<Integer>(new Comparator<Integer>(){
            public int compare(Integer n1, Integer n2) {
                return n2.compareTo(n1);
            }
        });
        // 把没有点的情况加进去
        pq.add(0);
        int pre = 0;
        List<List<Integer>> res = new ArrayList();
        // 遍历排好序的点,当时左边界的时候,高度加入队列,当是右边界的时候从队列中删除对应的高度,每次加入和删除时,如果队列的高度变更了,那么该坐标加入结果
        for(int[] b: list) {
            if(b[1] < 0) {
                pq.remove(0-b[1]);
                int cur = pq.peek();
                if(pre != cur) {
                    List<Integer> temp = new ArrayList();
                    temp.add(b[0]);
                    temp.add(cur);
                    res.add(temp);
                    pre = cur;
                }
            } else {
                if(pre < b[1]) {
                    List<Integer> temp = new ArrayList();
                    temp.add(b[0]);
                    temp.add(b[1]);
                    res.add(temp);
                    pre = b[1];
                }
                pq.add(b[1]);
            }
        }
        return res;
    }
}

相关文章

  • 力扣 218 天际线

    题意:给定一个大楼的坐标和高度,返回天际线坐标 思路:用队列遍历楼的左右边界,具体见注释 思想:队列 复杂度:时间...

  • LeetCode-218-天际线问题

    LeetCode-218-天际线问题 218. 天际线问题[https://leetcode-cn.com/pro...

  • 218. 天际线问题(leetcode)

    描述 城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。现在,假设您获得了城市风光照片(图A)上显示...

  • 前端算法之哈字典&希表

    一、力扣01两数之和 二、力扣217存在重复元素 三、力扣349两个数组的交集 四、力扣1207独一无二的出现次数...

  • 躬身入局,达己利他

    ——PPT营销力218计划复盘 PPT营销力第104次双周晨会结束了,本次主题是躬身入局,联想到本次218计划的实...

  • 力扣

    Add and Search Word - Data structure design Design a data...

  • 399. 除法求值(Python)

    题目 难度:★★★★☆类型:图方法:深度优先搜索 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题...

  • 413. 等差数列划分(Python)

    题目 难度:★★☆☆☆类型:数组方法:动态规划 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目...

  • 416. 分割等和子集(Python)

    题目 难度:★★★☆☆类型:数组方法:动态规划 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目...

  • 397. 整数替换(Python)

    题目 难度:★★☆☆☆类型:数组方法:数学 力扣链接请移步本题传送门更多力扣中等题的解决方案请移步力扣中等题目录 ...

网友评论

    本文标题:力扣 218 天际线

    本文链接:https://www.haomeiwen.com/subject/xolkvktx.html