84. 単調スタック -- ヒストグラム

84.ヒストグラムの最大の長方形

https://leetcode.cn/problems/largest-rectangle-in-histogram/submissions/

スタックの最上部とスタック最上部の次の要素、およびスタックにプッシュされる 3 つの要素が、必要な最大領域の高さと幅を構成します。

各列の左側と右側で、その列より小さい最初の列を見つけます。そのため、スタック ヘッド (要素はスタック ヘッドからポップされる) からスタックの一番下までの順序は、大きいものから小さいものになるはずです。

次の 3 つの状況です。

  • ケース 1: 現在トラバースされている要素の heights[i] が、スタックの最上位要素の heights[st.peek()] より小さい

  • ケース 2: 現在トラバースされている要素の heights[i] が、スタックの最上位要素の heights[st.peek()] に等しい

  • ケース 3: 現在トラバースされている要素の heights[i] がスタックの最上位要素の heights[st.peek()] より大きい

class Solution {
    public int largestRectangleArea(int[] heights) {
        Stack<Integer> st = new Stack<Integer>();
        int[] newheights = new int[heights.length + 2];
        newheights[0] = 0;
        newheights[newheights.length -1] =0;
        int sum =0;
        for(int i=0;i<heights.length;i++){
            newheights[i+1] = heights[i];
        }
        st.push(0);
        heights = newheights;

        for(int i=1;i<heights.length;i++){
            if(heights[i] > heights[st.peek()]){
                st.push(i);

            }else if(heights[i] == heights[st.peek()]){
                st.pop();
                st.push(i);
            }else{
                while(heights[i] < heights[st.peek()]){
                    int mid = st.peek();
                    st.pop();
                    int left = st.peek();
                    int right =i;
                    int w= right -left -1;
                    int h = heights[mid];
                    sum = Math.max(sum,w*h);
                }
                st.push(i);
            }
        }
return sum;
    }
}

おすすめ

転載: blog.csdn.net/weixin_56194193/article/details/129112255