Skip to content

Commit bb6a000

Browse files
authored
Update Readme.md
1 parent 0518651 commit bb6a000

File tree

1 file changed

+4
-8
lines changed
  • Segment_Tree/218.The-Skyline-Problem

1 file changed

+4
-8
lines changed

Segment_Tree/218.The-Skyline-Problem/Readme.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
### 218.The-Skyline-Problem
22

3-
#### 解法1:有序容器
3+
#### 解法1:扫描线
44

5-
此题需要设置一个multiSet记录所有的当前下降沿的高度,则*prev(Set.end(),1)就是这个Set里的最大值
5+
我们维护一个multiset,按照横轴的位置顺次考虑各个楼的上升沿和下降沿。遇到上升沿就往集合里加入一个H,遇到下降沿就在集合里删除一个H。这样每个时刻,集合里面的最大值,就代表了该位置(及其右边区间)的天际线高度。我们将这些```{位置,高度}```记录下来,就代表了天际线的轮廓
66

7-
首先,将所有的edges放入一个数组,按时间顺序排序,然后顺次遍历考虑:如果是上升沿,则在Set里加入对应高度(即添加一个上升沿);如果是下降沿,则需要在Set里删除对应的高度(即退出当前的下降沿)
7+
注意,如果相邻两个位置的高度一样,那么我们可以只保留第一个
88

9-
那何时对results进行更新呢?我们在每次处理edge时,不管是加入上升边沿还是退出下降沿之后,都意味着天际线有可能变动。天际线会变成什么呢?答案是此时Set里的最大值!回想一下,Set里装的是所有当前仍未退出的下降沿,说明他们都在当前可以撑起对应的高度。那么Set里的最大值就是当前天际线的最高值。
10-
11-
所以每次查看一个edges,我们都要比较当前的高度(用cur记录)和Set里的最大值进行比较:一旦不同,就用Set里的最大值去加入results,同时也要更新cur。
12-
13-
有一个细节需要注意,在生成edges数组时,如果某一个位置同时有上升沿也有下降沿,注意要先考察上升沿,再考察下降沿。也就是要先加入一个上升沿,再退出可能的下降沿。否则类似[[0,2,3],[2,5,3]]的测试例子就会有问题。
9+
类似的题目有```2158.Amount-of-New-Area-Painted-Each-Day```.
1410

1511
#### 解法2:线段树
1612

0 commit comments

Comments
 (0)