Advertisement
goodwish

131. The Skyline Problem

Nov 21st, 2019
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.90 KB | None | 0 0
  1. https://leetcode.com/problems/the-skyline-problem/
  2.  
  3. <code>
  4. from heapq import heappush, heappop
  5. import collections
  6. class Solution:
  7.     def buildingOutline(self, buildings):
  8.         # init
  9.         pre_h = 0
  10.         xs = []
  11.         for x1, x2, y in buildings:
  12.             xs.append((x1, 1, y))
  13.             xs.append((x2, -1, y))
  14.         xs.sort()
  15.         h, sky = [], []
  16.         del_log = collections.defaultdict(int)
  17.         n = len(xs)
  18.         for i, (x, flag, y) in enumerate(xs):
  19.             if flag == 1:
  20.                 heappush(h, -y)
  21.             elif flag == -1:
  22.                 self.del_y(-y, h, del_log)
  23.             curt_h = -h[0] if h else 0
  24.             if i == n - 1 or x != xs[i + 1][0]:
  25.                 if curt_h != pre_h:
  26.                     sky.append((x, curt_h))
  27.                     pre_h = curt_h
  28.         res = []
  29.         for i in range(len(sky) - 1):
  30.             x, y = sky[i]
  31.             if y == 0:
  32.                 continue
  33.             x2 = sky[i + 1][0]
  34.             res.append((x, x2, y))
  35.         return res
  36.    
  37.     def del_y(self, y, h, del_log):
  38.         if y != h[0]:
  39.             del_log[y] += 1
  40.             return
  41.        
  42.         heappop(h)
  43.  
  44.         while h and h[0] in del_log:
  45.             v = heappop(h)
  46.             del_log[v] -= 1
  47.             if del_log[v] == 0:
  48.                 del del_log[v
  49.  
  50. way 1: sweep_line + heap + delete log (逻辑删除),
  51. 封装: del_height(height, h, del_log) 帮助实现 log n 删除任一元素.
  52.  
  53. 先用扫描线排序, 每个建筑(起止点)顺序进出 heap 堆,
  54. 相同的 x 走完, 判断 max_y, 如果跟之前的 pre_y 有变化, 记录 (x, max_y) 为一个新拐点.
  55. - 用 heap 返回最高点 max_y,
  56. - if i == n - 1 or x != next_x; next_x = xs[i + 1][0] # 检查相同的 x 是否走完,
  57.  
  58. way 2: sweep_line + tree map, counter[h] = k,
  59. 用平衡二叉树返回最大值 max_y, 和查找更改一个值的个数(逻辑删除).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement