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], ...]
把每一个building拆成两个edge,一个入一个出。所有的edge加入到一个list中。再对这个list进行排序,排序顺序为:如果两个边的position不一样,那么按pos排,否则根据edge是入还是出来排。根据position从前到后扫描每一个edge,将edge根据是入还是出来将当前height加入或者移除heap。再得到当前最高点来决定是否加入最终结果。
vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) { vector<pair<int,int>> height, skyline; for(auto& b:buildings) { height.push_back({b[0], -b[2]}); height.push_back({b[1], b[2]}); } sort(height.begin(), height.end()); multiset<int> m; int prev = 0; m.insert(0); for(auto& h:height) { if (h.second < 0) { m.insert(-h.second); } else { m.erase(m.find(h.second)); } int cur = *m.rbegin(); if(cur != prev) { skyline.push_back({h.first, cur}); prev = cur; } } return skyline; }
Java代码就要麻烦一些了:
public List<int[]> getSkyline(int[][] buildings) { List<int[]> 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, new Comparator<int[]>(){ public int compare(int[] a, int[] b) { if(a[0] != b[0]) return a[0] - b[0]; return a[1] - b[1]; } }); Queue<Integer> pq = new PriorityQueue<>(new Comparator<Integer>(){ public int compare(Integer a, Integer b) { return 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 int[]{h[0], cur}); prev = cur; } } return result; }
Reference:
http://www.cnblogs.com/easonliu/p/4531020.html
http://www.shuatiblog.com/blog/2014/07/01/The-Skyline-Problem/
相关推荐
9. leetcode-218-The-Skyline-Problem.md:第218题,天际线问题,可能涉及到二维数组处理和线段树或平衡二叉搜索树的数据结构。 10. leetcode-115-Distinct-Subsequences.md:第115题,不同的子序列,涉及到动态规划...
《LeetCode---C++实现》是一本专注于C++编程语言解决LeetCode在线判题平台上的算法问题的书籍。LeetCode是程序员广泛使用的平台,它提供了大量的编程题目来提升编程技能和算法理解,尤其对于准备面试的程序员来说,...
leetcode-cli-plugins leetcode-cli 的第 3 方插件。 什么是 如何使用 如何使用 插件 名称 描述 增强的命令 按公司或标签过滤问题 list 不要在同一台计算机上使 Chrome 的会话过期 login 不要在同一台计算机上使 ...
哈希表 - LeetCode刷题 - 题解
LeetCode 101 - A Grinding Guide.pdf
leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站! ⦙⦙⦙⦙⦙⦙⦙⦙ 一个很打问题的方法。 问题来缓解离线思考。 编码前的源代码。 居住和与 leetcode.com。 下载你...
今天同步leetcode问题cpp示例 Github操作的Cpp示例sync-leetcode-today-problem问题
leetcode-cli 注意:这个存储库是为了临时使用而分叉的。 注意:从 webbrowser 复制 cookie 并使用leetcode user -c可以临时修复不能。 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的...
这个压缩包“leetcode--python”显然包含了与LeetCode相关的Python解题代码,可能是一个开源项目,用于存储用户或社区成员解决LeetCode问题的Python实现。 **LeetCode概述** LeetCode提供了一系列的算法和数据结构...
leetcode26 algo 算法与数据结构,练习代码 语言:java 8 开发工具:vscode,安装插件Java Extension Pack vscode有智能提示,可调试,有重构支持,满足代码练习要求,相比IDEA更轻量级,普通笔记本即可流畅运行。 ...
leetcode 答案Leetcode---算法 我对 Leetcode 算法问题的回答
leetcode 接口 该项目可帮助您使用首选的 IDE 或带有命令行界面 (CLI) 的编辑器来执行 leetcode。 入门 先决条件 Windows 10、MacOS、Linux Chrome版 >=90.0.4430 安装 # Prepare your virtual environment conda ...
leetcode-machine-swift :SOS_button: 请帮助在Sources/leetcode-machine-swift/leetcode.swift设置所有 leetcode 问题。 :SOS_button: 在 swift 编码时有 xcode 总是好的。 利用自动补全、类型检查...功能可以帮助...
leetcode-cli 一个享受 leetcode 的高效 cli 工具! 非常感谢 leetcode.com,一个非常棒的网站! ⦙⦙⦙⦙⦙⦙⦙⦙ 一个很打问题的方法。 问题来缓解离线思考。 编码前的源代码。 居住和与 leetcode.com。 下载你...
leetcode-训练 算法训练。 java $: javac hello.java java $: java hello c $: gcc hello.c 如果没有错误会生成a.out 可执行文件 c $: ./a.out leetcode cli leetcode version leetcode help leetcode help user ...
解题思路思路和LeetCode-python 503.下一个更大元素 II一致,只是这里求的是下标的距离,而不是数值倒序搜索,用到栈,栈里存储索引情况1:若栈为
leetcode 2 21 天-编程-挑战-ACES CP、探索新事物、Web 开发 第一天: 解决了 leetcode 问题 - 10 月 4 日 解决 codechef 十月挑战问题 写了一些关于 GFG 的文章 第 2 天: 解决了 leetcode 问题 - 10 月 5 日和 6 ...
leetcode-problem-crawler -r 1-5 爬行问题1、2、3: $ npx leetcode-problem-crawler -r 1,2,3 只是爬行问题5: $ npx leetcode-problem-crawler -r 5 然后我们将得到如下目录: ├── 001.two-sum │ ├── ...
leetcode中国 InterView_Problem English LeetCode / NowCoder / Timus ... Problems code. (Mainly Java implementation) Chinese 刷题代码,主要是java实现,可能会有其他语言代码 ...LeetCode-cn
leetcode-cli 一个享受leetcode的cli工具! 非常感谢 leetcode.com,一个非常棒的网站! ⦙⦙⦙⦙⦙⦙ 解决问题的一种方式。 本地问题,因此您可以轻松导航和离线思考。 在CLI 中做所有事情,甚至没有人知道你在做 ...