leetcode 天际线问题 python
2019-04-10 本文已影响0人
DaydayHoliday
有点像滑动窗口找最大值。所以就类比地维护一个大顶堆,如果有新的可能性的天际线,就加到堆里。弹出最大值时要先检查他是不是已经死了,死了就弹出它并测试下一个。
有两个不优雅的if,是为了解决[[0,2,3],[2,5,3]]这种情况的。以后再优化吧
import heapq
class Solution(object):
def getSkyline(self, buildings):
def is_dead(ele,s_cur):
ele_die=ele[1]
return ele_die<=s_cur
potential=[]
for building in buildings:
heapq.heappush(potential,(building[0],building[1],building[2]))
heapq.heappush(potential,(building[1],building[1],0))
live_potential=[]
skyline=[]
while len(potential)>0:
s_cur=heapq.heappop(potential)
heapq.heappush(live_potential,(-s_cur[2],s_cur[1]))
while len(live_potential)>0 and is_dead(live_potential[0],s_cur[0]):
heapq.heappop(live_potential)
cur_sky=0 if len(live_potential)==0 else -live_potential[0][0]
if len(skyline)>0 and s_cur[0]==skyline[-1][0]:# not elegant
skyline[-1][1]=max(skyline[-1][1],cur_sky)
if len(skyline)>1 and skyline[-1][1]==skyline[-2][1]:# not elegant
del skyline[-1]
else:
if len(skyline)==0 or cur_sky!=skyline[-1][1]:
skyline.append([s_cur[0],cur_sky])
return skyline