[Una pregunta del día] Likou 84: El rectángulo más grande del histograma

Descripción del título ( portal )

Dados n números enteros no negativos, se utilizan para representar la altura de cada columna en el histograma. Cada pilar es adyacente entre sí y tiene un ancho de 1.
Encuentre el área máxima del rectángulo que se puede delinear en el histograma.
Inserte la descripción de la imagen aquí

Lo anterior es un ejemplo de histograma, donde el ancho de cada columna es 1 y la altura dada es [2,1,5,6,2,3].
Inserte la descripción de la imagen aquí

La parte sombreada de la figura es el área rectangular más grande que se puede delinear y su área es de 10 unidades.

Ejemplo

示例:

输入: [2,1,5,6,2,3]
输出: 10

Ideas para resolver problemas

La solución de fuerza bruta
es contar primero el valor más alto en la matriz de alturas y luego atravesar brutalmente de 1 a alto con alto.

public static int largestRectangleArea(int[] heights) {
    
    
        //    [2,1,5,6,2,3]
        if (heights.length < 1) {
    
    
            return 0;
        }
        int len = heights.length;
        int high = heights[0];
        for (int i = 0; i < len ; i++) {
    
    
            if (heights[i] > high) {
    
    
                high = heights[i]; //最高的高度
                //System.out.println(high);
            }
        }
        int maxarea = 0;
        for (int i = 1; i <= high; i++) {
    
    
            int maxlen = 0;
            int tmp = 0;
            for (int j = 0; j < len; j++) {
    
    
                if (heights[j] >= i) {
    
    
                    tmp++;
                }else {
    
    
                    maxlen = Math.max(maxlen, tmp);// 更新最大长度
                    tmp = 0;
                }
            }
            maxlen = Math.max(maxlen,tmp);//一定注意这里,因为上边循环退出,可能是最后一个高度高于i,也有可能不是。当是最后一个最高时刚好结束了循环,那么就没有去更新maxlen。
            maxarea = Math.max(maxarea, maxlen * i);// 更新最大面积
        }
        return maxarea;

    }

Aquí he atravesado todas las alturas, la complejidad del tiempo es demasiado alta. Esto se puede optimizar, en lugar de atravesar todas las alturas, al igual que el problema de los barriles de agua de madera, el valor máximo de agua depende de la tabla más corta. Entonces, solo necesita atravesar el valor de altura que tiene (la altura del área más grande debe ser un valor en los elementos existentes de la matriz).

public static int largestRectangleArea(int[] heights) {
    
    
        //    [2,1,5,6,2,3]
        if (heights.length < 1) {
    
    
            return 0;
        }
        int len = heights.length;
        int high = heights[0];

        int maxarea = 0;
        for (int i = 0; i < len; i++) {
    
    
            if (heights[i] > high) {
    
    
                high = heights[i]; //最高的高度
                //System.out.println(high);
            }
            int high_tmp = heights[i];

            int maxlen = 0;
            int tmp = 0;
            for (int j = 0; j < len; j++) {
    
    
                if (heights[j] >= high_tmp) {
    
    
                    tmp++;
                }else {
    
    
                    maxlen = Math.max(maxlen, tmp);// 更新最大长度
                    tmp = 0;
                }
            }
            maxlen = Math.max(maxlen,tmp);//一定注意这里,因为上边循环退出,可能是最后一个高度高于i,也有可能不是。当是最后一个最高时刚好结束了循环,那么就没有去更新maxlen。
            maxarea = Math.max(maxarea, maxlen * high_tmp);// 更新最大面积
        }
        return maxarea;

    }

La solución a la pila monótona se complementará después de que la estudie más adelante.

Supongo que te gusta

Origin blog.csdn.net/weixin_45532227/article/details/111768770
Recomendado
Clasificación