问题陈述:在某个一维景观中有N个建筑每栋楼的高度由hi,i∈[1,N]给出如果将K个相邻建筑连接起来,它们将形成一个面积K×min(hi,hi+1,…,hi+K-1)的实心矩形。
给定n个建筑物,找出由连续建筑物形成的最大实体面积。
下面是我的解决方案在我看来很好,但是对于测试用例来说它是失败的。
有谁能告诉我下面的解决方案有什么问题吗。

public class Solution {

    public static void main(String[] args) {
        InputReader ir = new InputReader(System.in);
        int N = ir.nextInt();
        long [] hts = new long[N];
        long [] res = new long[N+1];
        for(int i=0; i<N; i++){
            hts[i] = ir.nextLong();
        }

        //Computes max area for subset of length 1
        long max = Integer.MIN_VALUE;
        for(int i=1; i<=N; i++){
            if(max<hts[i-1]){
                 max = hts[i-1];
            }
        }

        res[1] = max;
        /* Computes max of all the minimum heights
         * of subsets of length i and
         * store area at res[i] position
         */
        for(int i=2; i<=N; i++){
            max = Integer.MIN_VALUE;
            for(int j=0; j<N-i+1; j++){
                long min = hts[j];
                for(int k=j+1;k<i-j;k++){
                    if(hts[k]<min){
                        min = hts[k];
                    }
                }
                if(min>max){
                    max = min;
                }
            }
            res[i] = i*max;
        }

       // Get maximum area
        long result = res[1];
        for(int i=2; i<N+1;i++){
            if((res[i])>result){
                result = res[i];
            }
        }

        System.out.println(result);
    }
}

最佳答案

有比暴力更快的解决方案,只需将每栋建筑映射到其对应物上,如下所示:

           _____
      _____|   |
______|<--||-->|_____
|<---||---||---||-->|
|    ||   ||   ||   |

现在很容易找到最大面积:
int getMaxArea(int[] in)
    map height_to_maxw

    stack last_height
    stack at_pos

    int max_area = 0

    for int i in [0 , length(in))
        if !last_heigth.isEmpty()
            while last_height.peek() > in[i]
                int l_h = last_height.pop()
                int l_w = i - at_pos.pop()

                if l_h * l_w > max_area
                    max_area = l_h * l_w

    //check if the widest area is the greatest
    int h = min(in[0] , in[length(in) - 1])
    if h * length(in) > max_area
        max_area = h * length(in)

    return max_area

关于algorithm - 给定N座建筑物,找出由连续建筑物形成的最大此类实体区域,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33020176/

10-10 21:50