博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] The Skyline Problem
阅读量:6837 次
发布时间:2019-06-26

本文共 3801 字,大约阅读时间需要 12 分钟。

A city's skyline is the outer contour of the silhouette formed by all the buildings in that city when viewed from a distance. Now suppose you are given the locations and height of all the buildings as shown on a cityscape photo (Figure A), write a program to output the skyline formed by these buildings collectively (Figure B).

The geometric information of each building is represented by a triplet of integers [Li, Ri, Hi], where Li and Ri are the x coordinates of the left and right edge of the ith building, respectively, and Hi is its height. It is guaranteed that 0 ≤ Li, Ri ≤ INT_MAX, 0 < Hi ≤ INT_MAX, and Ri - Li > 0. You may assume all buildings are perfect rectangles grounded on an absolutely flat surface at height 0.

For instance, the dimensions of all buildings in Figure A are recorded as: [ [2 9 10], [3 7 15], [5 12 12], [15 20 10], [19 24 8] ] .

The output is a list of "key points" (red dots in Figure B) in the format of [ [x1,y1], [x2, y2], [x3, y3], ... ] that uniquely defines a skyline. A key point is the left endpoint of a horizontal line segment. Note that the last key point, where the rightmost building ends, is merely used to mark the termination of the skyline, and always has zero height. Also, the ground in between any two adjacent buildings should be considered part of the skyline contour.

For instance, the skyline in Figure B should be represented as:[ [2 10], [3 15], [7 12], [12 0], [15 10], [20 8], [24, 0] ].

Notes:

  • The number of buildings in any input list is guaranteed to be in the range [0, 10000].
  • The input list is already sorted in ascending order by the left x position Li.
  • The output list must be sorted by the x position.
  • There must be no consecutive horizontal lines of equal height in the output skyline. For instance, [...[2 3], [4 5], [7 5], [11 5], [12 7]...] is not acceptable; the three lines of height 5 should be merged into one in the final output as such: [...[2 3], [4 5], [12 7], ...]

这道题真的是太难了。参考了大神博客()才依葫芦画瓢写出来。

  • 扫描线大法。将每一线段的左右节点分开,按从小到大排序。
  • heap记录当前的动态高度
  • 如果遇到左节点,就push到heap
  • 遇到右节点就从heap中remove高度
  • 对当前时间轴的操作完成后,检查和previous hight是否相同,不同的话就记录高度变化
class Solution {        class Node {        int x;        int h;        int lr;   // indicate left or right (left: -1, right: 1).        public Node(int x, int h, int lr) {            this.x = x;            this.h = h;            this.lr = lr;        }    }         class MyComparator implements Comparator
{ @Override public int compare(Node a, Node b) { if (a.x != b.x) { return a.x - b.x; } if (a.lr == -1 && b.lr == -1) { return b.h - a.h; } else if (a.lr == 1 && b.lr == 1) { return a.h - b.h; } else { return a.lr - b.lr; } } } public List
> getSkyline(int[][] buildings) { List
> res = new ArrayList<>(); if (buildings == null || buildings.length == 0) { return res; } int pre = 0; // 以前的高度 PriorityQueue
heap = new PriorityQueue<>((x, y) -> y-x); heap.offer(0); List
nodes = new ArrayList<>(); for (int i = 0; i < buildings.length; i++) { nodes.add(new Node(buildings[i][0], buildings[i][2], -1)); nodes.add(new Node(buildings[i][1], buildings[i][2], 1)); } nodes.sort(new MyComparator()); for (Node n : nodes) { System.out.println(n.x + ", " + n.h + ", " + n.lr); if (n.lr == -1) { heap.offer(n.h); } else { heap.remove(n.h); } if (pre != heap.peek()) { List
e = new ArrayList<>(); e.add(n.x); e.add(heap.peek()); pre = heap.peek(); res.add(e); } } return res; }}

 

 

转载于:https://www.cnblogs.com/yinger33/p/10982979.html

你可能感兴趣的文章
请求网络网络编程
查看>>
文件目录Android SDK目录结构
查看>>
Asp.net Web.Config - 配置元素customErrors
查看>>
Android: how to resolve Application’s parameter NullPointerException
查看>>
EntityFramework用法探索(二)CodeFirst
查看>>
人人都来写算法 之 快速排序
查看>>
[转]SQLServer和Oracle,存储过程区别,常用函数对比
查看>>
如何在ArcMap中监听键盘鼠标事件
查看>>
vs2012中程序集生成无法自动在网站Bin目录下生成Dll文件?(已解决!)
查看>>
fastDFS同步问题讨论
查看>>
ActiveMQ学习笔记(二) JMS与Spring
查看>>
实验室报告:VMware vSphere Data Protection
查看>>
php的数组与字符串的转换函数整理
查看>>
WCF 框架运行时类图
查看>>
spring配置异步执行
查看>>
软件开发报价的计算方法
查看>>
大型网站系统架构分析--转
查看>>
php 文件操作
查看>>
poj 1474 Video Surveillance - 求多边形有没有核
查看>>
c#接口和抽象类对比学习
查看>>