leetcode 84. 柱状图中最大的矩形-java实现

题目所属分类

单调栈解决的问题就是左边离它最近的且比它小的数的下标
枚举加优化
复习单调栈的模板

原题链接

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

代码案例:在这里插入图片描述

题解

在这里插入图片描述

单调栈的写法

class Solution {
    public int largestRectangleArea(int[] heights) {
            int n = heights.length;
            int[] left = new int[n+1];
            int[] right = new int[n+1];
            Stack<Integer> s = new Stack<>();
            //形成左边界
            for(int i = 0 ; i < heights.length ; i++){
                while(!s.isEmpty() && heights[s.peek()]  >= heights[i]) s.pop();
                if(s.isEmpty()) left[i] = -1 ;
                else left[i] = s.peek();
                s.push(i);
            }
            s.clear();
            //形成右边界
             for(int i = n-1 ; i >= 0 ; i--){
                while(!s.isEmpty() && heights[s.peek()]  >= heights[i]) s.pop();
                if(s.isEmpty()) right[i] = n ;
                else right[i] = s.peek();
                s.push(i);
            }
            //遍历高
            int res = 0 ;
            for(int i = 0 ; i < n ; i++){
                res = Math.max(res,heights[i]*(right[i]-left[i]-1));//存的是范例中1的右边和2的左边
            }
            return res;

    }
}

数组的写法

class Solution {
    public int largestRectangleArea(int[] h) {
         int n=h.length;
        int[] stk=new int[n+5];
        int[] left=new int[n];
        int[] right=new int[n];
        int tt=0;
        for(int i=0;i<n;i++)
        {
            while(tt>0&&h[stk[tt]]>=h[i]) tt--;
            if(tt>0) left[i]=stk[tt];
            else left[i]=-1;
            stk[++tt]=i;
        }
        stk=new int[n+5];
        tt=0;
        for(int i=n-1;i>=0;i--)
        {
            while(tt>0&&h[stk[tt]]>=h[i]) tt--;
            if(tt>0) right[i]=stk[tt];
            else right[i]=n;
            stk[++tt]=i;
        }
        int ans=0;
        for(int i=0;i<n;i++)
        {
            ans=Math.max(ans,h[i]*(right[i]-left[i]-1));
        }
        return ans;
    }


    
}
posted @ 2022-10-11 18:57  依嘫  阅读(31)  评论(0)    收藏  举报