leetcode

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
上一篇下一篇

猜你喜欢

热点阅读