leetcode-218-天际线问题
[博客链接]
[题目描述]
1 | java复制代码城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回由这些建筑物形成的 天际线 。 |
[题目链接]
[github地址]
[思路介绍]
思路一:暴力扫描
- 输出点坐标要求
- 下一个点与当前节点高度不同,能通过两个节点确定一条单拐点直线
- 边界情况:第一个节点为第一个点的横坐标以及其高度,最后一点的为最后一个节点的横坐标和0
- 其实分析一下发现,我们要找的其实是每个区间的最高高度
- 然后通过这个最高高度的变化进行列表输出
- 通过Map进行存储每个节点的最高高度吧
- map好像没啥大用不如list一个最大整数段
- 直接内存溢出了
1 | java复制代码public List<List<Integer>> getSkyline(int[][] buildings) { |
时间复杂度O(n2)时间复杂度O(n^{2})时间复杂度O(n2)
思路二:扫描线
- 尝试用map记录区间
- 失败了 因为更新区间的时候会使map变化
- 看了三叶大佬的题解还是没太看懂预处理的思路由来
- 不过大概思路理解了
- 我换一种按我理解里更通俗的方式解释一下吧
- 首先要明白题意打印的点究竟是什么:按照扫描线观测可以发现,打印的点是每两条满足条件的扫描线形成的矩形的左端点
- 其次我们要明白有一种特殊情况,也就是说前一个矩形的右延线可能和当前矩形延长线是一条线,也就是说当前矩形的左端点应该前移到之前的左端点
- 记录每个矩形的左右端点,为了方便分辨左右端点
- 我们可以通过对于height的正负值进行标注
- 也就是说当height为负代表左端点,height为正代表右端点
- 通过大根堆来保证每个最高的左端点依次输出
1 | java复制代码 public List<List<Integer>> getSkyline(int[][] buildings) { |
时间复杂度O(n∗lgn)时间复杂度O(n*lg_{n}) 时间复杂度O(n∗lgn)
本文转载自: 掘金