题目:
题解:
python
class Solution:
def getSkyline(self, buildings: List[List[int]]) -> List[List[int]]:
buildings.sort(key=lambda bu:(bu[0],-bu[2],bu[1]))
buildings.append([inf,inf,inf])
heap = [[-inf,-inf,-inf]]
ans = []
for l,r,h in buildings:
if heap[0][2] < l:
topRight = heappop(heap)[2]
while heap and topRight < l:
if heap[0][2] > topRight:
# 建筑群内有较较矮的建筑宽度比高的大,对齐进行切块
top = heappop(heap)
top[1], topRight = topRight, top[2]
# 如果新的切块也覆盖到新建筑,不需要再放入了
if topRight >= l: heappush(heap, top)
if ans[-1][1] != -top[0]: ans.append([top[1], -top[0]])
else: heappop(heap)
if not heap: ans.append([topRight, 0])
if not heap or h > -heap[0][0]: ans.append([l, h])
if heap and heap[0][0] == -h and heap[0][2] < r: heap[0][2] = r
else: heappush(heap, [-h,l,r])
return ans[1:-1]