Leetcode 218 天际线问题

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)
        
    

猜你喜欢

转载自blog.csdn.net/zycxnanwang/article/details/82989651