Leetcode刷题84. 柱状图中最大的矩形

给定 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分治法
        问题可分为三种情况:
        1.找出最短柱子,矩形的宽尽可能往两边延伸
        2.在最短柱子的左边找出最大面积
        3.在最短柱子的右边找出最大面积
        举例[2,1,5,6,2,3]
        最短柱子为1,宽度为6,面积1*6=6
        对高度为1的左右两边采取同样的过程
        1的左边,形成面积2*1=2;1的右边,最短柱子2,形成面积2*4=8,以此类推,2的左边形成5*2=10,6*1=6,2的右边3*1=3
        最终得到面积最大值5*2=10

class Solution {
        public int largestRectangleArea(int[] heights) {
            return calculateMaxArea(heights, 0, heights.length - 1);
        }
 
        private int calculateMaxArea(int[] heights, int left, int right) {
            if (left > right) return 0;
            int minIndex = left;
            //求出最短柱子
            for (int i = left; i <= right; i++) {
                if (heights[i] < heights[minIndex]) {
                    minIndex = i;
                }
            }
            return Math.max(heights[minIndex] * (right - left + 1),
                    Math.max(calculateMaxArea(heights, left, minIndex - 1), calculateMaxArea(heights, minIndex + 1, right)));
        }
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章