Algorithm 建筑天际线

Algorithm 建筑天际线,algorithm,divide-and-conquer,Algorithm,Divide And Conquer,我想了解天际线的问题。给定n矩形建筑,我们需要计算天际线。我很难理解这个问题的输出 输入:(1,11,5)、(2,6,7)、(3,13,9)、(12,7,16)、(14,3,25)、(19,18,22)、(23,13,29)、(24,4,28)} 输出天际线:(1,11)、(3,13)、(9,0)、(12,7)、(16,3)、(19,18)、(22,3)、(25,0) 输出为成对(X轴,高度)。为什么第三对是(9,0)?如果我们看到天际线图,x轴值9的高度为13,而不是0。为什么显示0?换句话说

我想了解天际线的问题。给定
n
矩形建筑,我们需要计算天际线。我很难理解这个问题的输出

输入:(1,11,5)、(2,6,7)、(3,13,9)、(12,7,16)、(14,3,25)、(19,18,22)、(23,13,29)、(24,4,28)}

输出天际线:(1,11)、(3,13)、(9,0)、(12,7)、(16,3)、(19,18)、(22,3)、(25,0)


输出为成对
(X轴,高度)
。为什么第三对是
(9,0)
?如果我们看到天际线图,x轴值9的高度为13,而不是0。为什么显示0?换句话说,如果我们取第一个建筑(输入
(1,11,5)
),输出是
(1,11)
(5,0)
。你们能解释一下为什么它是
(5,0)
而不是
(5,11)

将屋顶间隔想象为左侧关闭,右侧打开。

你们的输出并不表示“在x处高度为y”,而是“在x处高度变为y”。

使用扫描线算法;以下是我的python版本解决方案:

class Solution:
    # @param {integer[][]} buildings
    # @return {integer[][]}
    def getSkyline(self, buildings):
        if len(buildings)==0: return []
        if len(buildings)==1: return [[buildings[0][0], buildings[0][2]], [buildings[0][1], 0]]

        points=[]
        for building in buildings:
            points+=[[building[0],building[2]]]
            points+=[[building[1],-building[2]]]
        points=sorted(points, key=lambda x: x[0])

        moving, active, res, current=0, [0], [],-1

        while moving<len(points):
            i=moving
            while i<=len(points):
                if i<len(points) and points[i][0]==points[moving][0]:
                    if points[i][1]>0:
                        active+=[points[i][1]]
                        if points[i][1]>current:
                            current=points[i][1]
                            if len(res)>0 and res[-1][0]==points[i][0]: 
                                res[-1][1]=current
                            else:
                                res+=[[points[moving][0], current]]
                    else:
                        active.remove(-points[i][1])
                    i+=1
                else:
                    break

            if max(active)<current:
                current=max(active)
                res+=[[points[moving][0], current]] 
            moving=i
        return res 
类解决方案:
#@param{integer[][]}建筑物
#@return{integer[][]}
def getSkyline(自身、建筑物):
如果len(建筑物)==0:返回[]
如果len(buildings)==1:返回[[buildings[0][0],buildings[0][2],[buildings[0][1],0]]
点数=[]
对于建筑物中的建筑物:
点数+=[[建筑[0],建筑[2]]
点数+=[[建筑[1],-建筑[2]]
点=已排序(点,键=λx:x[0])
移动,活动,分辨率,当前=0,[0],,-1
移动0和res[-1][0]==点[i][0]时:
res[-1][1]=当前
其他:
res+=[[点[移动][0],当前]]
其他:
活动。删除(-i][1])
i+=1
其他:
打破
如果最大(活动)
静态长最大矩形(int[]h){
int k=1;
int n=h.长度;
长最大值=0;

虽然(kYou应该发布一篇文章来解决这个问题,对于那些不知道天际线问题是什么的人来说。请查看我关于这个问题的博客文章。
static long largestRectangle(int[] h) {

    int k=1;
    int n=h.length;
    long max=0;

    while(k<=n){

        long area=0;
        for(int i=0;i<n-k+1;i++){
            long min=Long.MAX_VALUE;
            
            for(int j=i;j<i+k;j++){

                //System.out.print(h[j]+" ");
                min=Math.min(h[j],min);
            }
           // System.out.println();
            area=k*min;
            //System.out.println(area);
            max=Math.max(area,max);
        }
        //System.out.println(k);
        k++;
    }
    return max;
}