Leetcode 218 天际线问题

本文深入解析了LeetCode上的经典题目“天际线问题”,通过归并排序的方法解决高楼轮廓描绘的问题。文章详细介绍了算法思路,包括如何切分和合并高楼集合,以及如何维护和更新天际线的高度,最终实现高效地生成城市天际线轮廓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
        
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值