zoukankan      html  css  js  c++  java
  • 柱状图中最大的矩形

    分治算法:

    通过观察,可以发现,最大面积矩形存在于以下几种情况:
    确定了最矮柱子以后,矩形的宽尽可能往两边延伸。
    在最矮柱子左边的最大面积矩形(子问题)。
    在最矮柱子右边的最大面积矩形(子问题)。
     
    举个例子:
    [6, 4, 5, 2, 4, 3, 9]
    这里最矮柱子高度为 2 。以 2 为高的最大子矩阵面积是 2x7=14 。现在,我们考虑上面提到的第二种和第三种情况。我们对高度为 2 柱子的左边和右边采用同样的过程。在 2 的左边, 4 是最小的,形成区域为 4x3=12 。将左边区域再继续分,矩形的面积分别为 6x1=6 和 5x1=5 。同样的,我们可以求出右边区域的面积为 3x3=9, 4x1=4 和 9x1=9 。因此,我们得到最大面积是 16 。具体过程可参考下图:
     
    代码:
    public class Solution {
        public int calculateArea(int[] heights, int start, int end) {
            if (start > end)
                return 0;
            int minindex = start;
            for (int i = start; i <= end; i++)
                if (heights[minindex] > heights[i])
                    minindex = i;
            return Math.max(heights[minindex] * (end - start + 1), Math.max(calculateArea(heights, start, minindex - 1), calculateArea(heights, minindex + 1, end)));
        }
        public int largestRectangleArea(int[] heights) {
            return calculateArea(heights, 0, heights.length - 1);
        }
    }
     
     
  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    对闭包的理解(closure)
    HDU
    Python字典遍历的几种方法
    面向对象的六大原则
    Android添加代码检查权限
    Android请求网络权限
    android广播接收器BroadcastReceiver
    Android中SQLite下 Cursor的使用。
  • 原文地址:https://www.cnblogs.com/tsdblogs/p/12361184.html
Copyright © 2011-2022 走看看