Hebilla 84. Rectángulo más grande en histograma

Este es un problema muy típico que utiliza una pila monotónica para resolver el problema de la síntesis de orden y tamaño. La pila monotónica es particularmente adecuada para resolver problemas donde el tamaño de los dos extremos determina el tamaño del valor medio.

Porque en la pila monótona, la pila de aumento monótono se usa como ejemplo. Deje que el elemento en la parte superior de la pila sea b, y el segundo elemento en la parte superior de la pila sea a. Naturalmente, a <b (porque la pila se hace más grande). En este momento,
si aparece c y c es menor que b, entonces la primera izquierda y derecha de b es mayor que b Se encuentran los dos elementos pequeños, a saber, ayc, yb es el más grande en el medio.
En este momento puede procesar by reorganizar la pila para mantenerla en aumento. Si c es mayor que b, entonces c es empujado hacia la pila y el ciclo continúa. Finalmente limpia la pila

/ ********
Autor: Allen-238
enlace: https: //leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/ji-jian-python-shen-du-jie- xi-dan-diao-dui-zhan-zu /
Fuente: LeetCode Los derechos de autor pertenecen al autor. Para reproducción comercial, por favor contacte al autor para autorización, y para reproducción no comercial, por favor indique la fuente.
********* /

for i  in  list:
    while i is not empty and stack[-1] > i: 先调整位置。
        stack.pop()
    stack.append(i)  #当前元素无论如何也要放进去,不同的只是需不需要pop来调整位置

作者:allen-238
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/ji-jian-python-shen-du-jie-xi-dan-diao-dui-zhan-zu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

El detalle a tener en cuenta aquí es que la
parte inferior de la pila debe llenarse con -1, que indica la parte inferior de la pila.
Al final del ciclo, la pila debe limpiarse. En este momento, el límite derecho c de todos los elementos que continúan almacenados en la pila es el extremo final (altura) -1

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        stack = [-1]
        max_res = 0
        for i in range(len(heights)):
            while len(stack) > 1 and heights[i] <= heights[stack[-1]]:
                max_res = max(max_res, heights[stack.pop()] * (i - stack[-1] - 1))  
            stack.append(i)
        for i in range(len(stack)-1):
            max_res = max(max_res, heights[stack.pop()]*(len(heights)-1-stack[-1]))
        return max_res

作者:allen-238
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/ji-jian-python-shen-du-jie-xi-dan-diao-dui-zhan-zu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Mi propia solución: referirme a los demás. De hecho, el método de fuerza bruta resuelve el valor máximo del área rectangular con cada barra rectangular como la altura mínima . Código C ++:

#include <iostream>

using namespace std;

const int N = 10000;
int h[N];

int main()
{
    int n, s_max = 0, i = 0,ileft,iright,ih;
    cin >> n;

    while(i < n){
        cin >> h[i];
        i++;
    }
    for(i = 0;i < n;i++){
        int left = i - 1, right = i + 1;
        while(left >= 0 && h[left] >= h[i])--left;
        while(right < n && h[right] >= h[i]) ++right;
        int tmp = (right - left - 1) * h[i];
        s_max = s_max > tmp ? s_max:tmp;
    }
    cout<<s_max<<endl;
    return 0;
}
Publicado 21 artículos originales · elogiado 0 · visitas 81

Supongo que te gusta

Origin blog.csdn.net/weixin_43963453/article/details/105396262
Recomendado
Clasificación