柱状图中最大的矩形java

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

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

以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。

图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。

示例:

输入: [2,1,5,6,2,3]
输出: 10

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-rectangle-in-histogram
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:这题我只想到了从左到右的暴力解法O(n^2),看了官方的是O(n)就直接贴他的了,官方题解也有两种暴力解法,固定高,固定左节点。
ps:好像是没发出去,再发一次

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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43824233/article/details/111750027