Leecode84 mayor-rectángulo-en-histograma

Descripción del título

Dé n números para representar la altura de la barra del histograma. El ancho de cada barra del histograma es 1. Calcule el área del rectángulo más grande en el histograma. La
Inserte la descripción de la imagen aquí
figura de arriba es que cada barra tiene un ancho de 1. , 2,3]. Histograma
Inserte la descripción de la imagen aquí
La parte sombreada de la figura es el rectángulo con el área más grande en el histograma, con un área de 10 unidades.
Por ejemplo:
altura dada = [2,1,5,6,2,3],
Devuelve 10.

Análisis

  • Usando una estructura de pila, la matriz almacena subíndices y los elementos se suben a la pila.
  • Si no es un incremento, significa que ha aparecido el límite derecho del elemento superior de la pila.
  • Ahora haga estallar la parte superior de la pila y calcule cuánto tiempo puede cubrir lateralmente.
  • En este momento, la parte superior de la pila es el límite izquierdo.
  • Calcule el área y actualice el valor máximo.
  • Después de eso, los elementos restantes en la parte superior de la pila son solo elementos incrementales, utilizando el mismo método.

Código

import java.util.Stack;
public class Solution {
    public int largestRectangleArea(int[] height) {
        if(height == null || height.length == 0){
            return  0;
        }
          //装下标 递增元素下标 push
        Stack<Integer> stack = new Stack<>();
        int max = 0;
        for (int i = 0; i < height.length; i++) {
            //递增 push
            if(stack.empty() || height[i] >= height[stack.peek()]){
                stack.push(i);
            }else{
                //要考虑的高度  计算影响范围
                int h = height[stack.pop()];
                //考虑等高
                while (!stack.empty() && h == height[stack.peek()]){
                    stack.pop();
                }
                //因为stack递增加入的 所以弹出第一个不为h的  就是h的左边界
                int left = stack.empty()?-1:stack.peek();
                //i是右边界 i比 栈顶小
                max = Math.max(max,(i-left-1)*h);
                //下一次还要继续考虑这个i
                i--;
            }
        }
        //stack 剩下的全是递增的 而stack的peek一定是最高那个元素 对应的下标 那么有边界+1
        //其他的更低元素  右边界也是这样
        int right = stack.peek()+1;
        while(!stack.empty()){
            int h = height[stack.pop()];
            int left = stack.empty()?-1:stack.peek();
            max = Math.max(max,(right-left-1)*h);
        }


        return max;
    }
}
72 artículos originales publicados · Me gusta0 · Visitas 718

Supongo que te gusta

Origin blog.csdn.net/weixin_40300702/article/details/105544890
Recomendado
Clasificación