Lintcode131 Building Outline solution 题解

【题目描述】

GivenNbuildings in a x-axis,each building is a rectangle and can be represented by a triple (start, end, height),where start is the start position on x-axis, end is the end position on x-axis and height is the height of the building. Buildings may overlap if you see them from far away,find the outline of them。


Notice

Please merge the adjacent outlines if they have the same height and make sure different outlines cant overlap on x-axis.

在x轴的n个建筑物中,每一个建筑物都是矩形,可以用三个量(开始,结束,高度)来表示,其中开始是x轴的起始位置,末端是x轴的结束位置,高度是建筑物的高度。如果你从很远的地方看,找它们的轮廓,你可能会看到建筑物重叠。

【注】:一个轮廓可以用三个量(开始,结束,高度)来表示,其中起始是轮廓的x轴的起始位置,末端是x轴的结束位置,高度是轮廓的高度。

【题目链接】

www.lintcode.com/zh-cn/problem/building-outline/

【题目解析】

用一个带最大堆的扫描线遍历数组,每出现一个拐点则记录一次区间。新加入一个元素后若堆顶元素和之前不同,则表明出现拐点。

首先处理数组中元素。将每一个点用一个point来保存,保存time(开始写错了,应该是位置,但是要改的太多了),flag(起点为1,终点为0),height。用一个HashMap来记录每一对终点和起点(终点为key,起点为value)。

将所有point保存在一个list中并排序,首先根据时间从小到大排序,若时间相等则根据flag排序(先起点后终点),若flag也相等则根据height排序(若同为起点则从大到小排序,若同为终点则从小到大排序)。这样可以避免重复解。

再构建一个最大堆,用于记录加入的元素的最大值。

开始遍历list中每个point,起点元素加入堆,终点元素删去堆中对应的起点元素。

当遇到一个起点元素时,先记录加入前堆顶元素,然后将该起点元素加入,再看加入后堆顶元素,1)若没有变化,则继续下一个point;2)若有变化,则说明出现拐点,将之前堆顶元素时间作为起点,当前堆顶元素时间作为终点,之前堆顶元素高度作为高度。注意:就算堆顶元素变化,但是如果之前堆顶元素和当前堆顶元素时间相同,说明是在这个时间连续有几个起点被加入,宽度为0,不能算一个区间。

当遇到一个终点元素时,将其对应的起点元素从堆中删除。若此时堆为空,则和5中一样记录一个区间,并继续下一个point。若堆不为空,则需要看此时堆顶元素是否改变。若不变则继续,否则说明出现“拐点”。此处“拐点”要分两种情况讨论: 1)若新的堆顶元素高度和之前堆顶元素高度相同,则说明相同高度的两段区间有重叠,题目要求若发生这种情况要合并这两段区间,所以我们要保留之前的堆顶元素(两段同高度相同重叠区间的最左边),删去新的堆顶元素(即代替原堆顶元素被删除,因为每遇到一个终点必须删去一个起点),具体做法可以是先删去新堆顶元素,再加入原堆顶元素,或者直接将新堆顶元素时间改为原堆顶元素时间。 2)若新堆顶和原堆顶元素高度不同,则像5中那样记录一个区间,但是要将现在的堆顶元素时间改为遇到的终点元素的时间。

遍历完整个list结束

【参考答案】

www.jiuzhang.com/solutions/building-outline/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 第一章 绪论 什么是数据结构? 数据结构的定义:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 第二章...
    SeanCheney阅读 5,828评论 0 19
  • 归去来兮。 1.1 说明 本篇为《挑战程序设计竞赛(第2版)》[http://www.ituring.com.cn...
    尤汐Yogy阅读 14,470评论 0 160
  • 今天下午放学的时候,我陪李彩云去超市买了东西我们就跟上了队,跟上之后我看见前面围着一群人,我跑过去一看原来是...
    清新浪阅读 231评论 0 0
  • 不知起于何时,我开始变得懒于写东西,也不那么渴望发表什么了,反而是在印象笔记里塞了一大堆的杂七杂八的东西。像什么日...
    风不千山阅读 530评论 0 0