Rectángulo más grande en histograma java

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.

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].

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:

Entrada: [2,1,5,6,2,3]
Salida: 10

Fuente: LeetCode (LeetCode)
Enlace: https://leetcode-cn.com/problems/largest-rectangle-in-histogram Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Idea: Solo pensé en la solución violenta O (n ^ 2) de izquierda a derecha para esta pregunta. La publiqué directamente después de leer el oficial O (n). La solución oficial también tiene dos soluciones violentas, fija alta y fija izquierda nodo.
ps: parece que no se ha enviado, envíalo de nuevo

class Solution {
    
    
    public int largestRectangleArea(int[] heights) {
    
    
        int n = heights.length;
        int[] left = new int[n];
        int[] right = new int[n];
        
        Stack<Integer> mono_stack = new Stack<Integer>();
        for (int i = 0; i < n; ++i) {
    
    
            while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) {
    
    
                mono_stack.pop();
            }
            //最近的小于其的左边的位置 
            left[i] = (mono_stack.isEmpty() ? -1 : mono_stack.peek());
            mono_stack.push(i);
        }

        mono_stack.clear();
        for (int i = n - 1; i >= 0; --i) {
    
    
            while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) {
    
    
                mono_stack.pop();
            }
            //最近的小于其的右边的位置 
            right[i] = (mono_stack.isEmpty() ? n : mono_stack.peek());
            mono_stack.push(i);
        }
        
        int ans = 0;
        //固定其高度,加上拥有了左右节点
        for (int i = 0; i < n; ++i) {
    
    
            ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]);
        }
        return ans;
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43824233/article/details/111750027
Recomendado
Clasificación