算法: 直方图中的最大矩形84. Largest Rectangle in Histogram

Posted AI架构师易筋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法: 直方图中的最大矩形84. Largest Rectangle in Histogram相关的知识,希望对你有一定的参考价值。

84. Largest Rectangle in Histogram

Given an array of integers heights representing the histogram’s bar height where the width of each bar is 1, return the area of the largest rectangle in the histogram.

Example 1:

Input: heights = [2,1,5,6,2,3]
Output: 10
Explanation: The above is a histogram where width of each bar is 1.
The largest rectangle is shown in the red area, which has an area = 10 units.

Example 2:

Input: heights = [2,4]
Output: 4

Constraints:

  • 1 <= heights.length <= 105
  • 0 <= heights[i] <= 104

当前位置height[i] 找到左边和右边的第一个小于它的位置。

对于任何条形i,最大矩形的宽度为r - l - 1其中 r - 是条形右侧h[r] >= h[i]的最后一个坐标,高度为l - 是条形左侧的最后一个坐标,其高度h[l] >= h[i]

因此,如果对于任何i坐标,我们知道他在右侧和左侧的最高(或相同高度)邻居,我们可以轻松找到最大的矩形:

int maxArea = 0;
for (int i = 0; i < height.length; i++) 
    maxArea = Math.max(maxArea, height[i] * (lessFromRight[i] - lessFromLeft[i] - 1));

主要技巧是如何有效地计算lessFromRight和lessFromLeft数组。简单的解决方案是使用O(n^2)解决方案,对于每个i元素,首先在第二个内部循环中找到他的左/右 heighbour,只是向后或向前迭代:

for (int i = 1; i < height.length; i++)               
    int p = i - 1;
    while (p >= 0 && height[p] >= height[i]) 
        p--;
    
    lessFromLeft[i] = p;              

唯一的行更改将此算法从O(n^2) 转换为O(n)复杂度:我们不需要重新扫描左侧的每个项目 - 我们可以重用先前计算的结果并快速“跳转”索引:

while (p >= 0 && height[p] >= height[i]) 
      p = lessFromLeft[p];

这是整个解决方案:

class Solution 
    public int largestRectangleArea(int[] heights) 
        int len = heights.length;
        int[] lessFromLeft = new int[len];
        int[] lessFromRight = new int[len];
        lessFromLeft[0] = -1;
        lessFromRight[len - 1] = len;
        
        for (int i = 1; i < len; i++) 
            int p = i - 1;
            while (p >= 0 &&  heights[p] >= heights[i]) 
                p = lessFromLeft[p];
            
            lessFromLeft[i] = p;
        
        
        for (int i = len - 2; i >= 0; i--) 
            int p = i + 1;
            while (p < len && heights[p] >= heights[i]) 
                p = lessFromRight[p];
            
            lessFromRight[i] = p;
        
        
        int maxArea = 0;
        for (int i = 0; i < len; i++) 
            maxArea = Math.max(maxArea, heights[i] * (lessFromRight[i] - lessFromLeft[i] - 1));
        
        
        return maxArea;
    

参考

https://leetcode.com/problems/largest-rectangle-in-histogram/discuss/28902/5ms-O(n)-Java-solution-explained-(beats-96)

以上是关于算法: 直方图中的最大矩形84. Largest Rectangle in Histogram的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 85--最大矩形(Maximal Rectangle)

[Leetcode] largest rectangle in histogram 直方图中最大的矩形

84. 柱状图中最大的矩形(Largest Rectangle in Histogram)

Leetcode 84 求直方图中矩形的最大面积

[leetcode] 85. 最大矩形

84. Largest Rectangle in Histogram