Leetcode 218 天际线问题
-
思路
可以看成一个归并问题
切分的时候,如果剩一个元素,返回它表示的两个轮廓点,如果为空,返回空
合并是重点:
-
维护两个变量:h1,h2 h1表示左半部分当前位置高度,h2表示右半部分当前位置高度
-
如果当前位置左半部分横坐标更小,就更新h1,从左半部分选元素;
-
如果当前位置右半部分横坐标更小,就更新h2,从右半部分选元素;
-
如果一样大,就更新h1,h2,从左(或右)半部分选元素
-
当向结果中插入点时,只有和结果中最后一个点高度不同的点才能插入到结果里
且一直使用高度max(h1,h2)。
-
当某一部分全部访问完,就将另一部分直接插入结果里(注意高度不要与之前重复)。
-
-
AC代码
class Solution(object): def mergeSort(self, arr): if len(arr) <= 0: return None if len(arr) == 1: return [[arr[0][0], arr[0][2]], [arr[0][1], 0]] n = len(arr) middle = n / 2 one = self.mergeSort(arr[:middle]) two = self.mergeSort(arr[middle:]) if one == None: return two if two == None: return one #合并两个数组 h记录当前高度 i, j, h1, h2, before = 0, 0, -1, -1, -1 data = [] while i < len(one) and j < len(two): if one[i][0] < two[j][0]: h1 = one[i][1] if max(h1, h2) != before: data.append([one[i][0], max(h1,h2)]) before = max(h1, h2) i += 1 elif one[i][0] > two[j][0]: h2 = two[j][1] if max(h1, h2) != before: data.append([two[j][0], max(h1, h2)]) before = max(h1, h2) j += 1 else: h1 = one[i][1]; h2 = two[j][1] if max(h1, h2) != before: data.append([one[i][0], max(h1, h2)]) before = max(h1, h2) i += 1 while i < len(one): if one[i][1] != before: data.append([one[i][0], one[i][1]]) before = one[i][1] i += 1 while j < len(two): if two[j][1] != before: data.append([two[j][0], two[j][1]]) before = two[j][1] j += 1 return data def getSkyline(self, buildings): """ :type buildings: List[List[int]] :rtype: List[List[int]] """ if buildings == []: return [] return self.mergeSort(buildings)