• 柱状图中最大的矩形


    分治算法:

    通过观察,可以发现,最大面积矩形存在于以下几种情况:
    确定了最矮柱子以后,矩形的宽尽可能往两边延伸。
    在最矮柱子左边的最大面积矩形(子问题)。
    在最矮柱子右边的最大面积矩形(子问题)。
     
    举个例子:
    [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);
        }
    }
     
     
  • 相关阅读:
    BFS 路径记录
    KMP算法
    STL标准库-容器-deque 双端队列
    4. 位运算(快速幂)
    词频统计(未完成,错误)
    字符串转整形
    AVL平衡二叉树的各种问题(Balanced Binary Tree)
    string用scanf读入printf输出(节省时间)
    【转】Java魔法堂:String.format详解
    【转】关于Android资源文件中出现百分号的问题
  • 原文地址:https://www.cnblogs.com/tsdblogs/p/12361184.html
Copyright © 2020-2023  润新知