📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待
柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4]
输出: 4
思路
接雨水 中是找每个柱子左右两边第一个大于该柱子高度的柱子,而本题是找每个柱子左右两边第一个小于该柱子的柱子。
为什么这么说呢,因为如下图所示,高为3的柱子可以继续往右边蔓延扩大面积,如果往左边的话则长度不够
所以要找当前柱子i左右两侧第一个小于他的柱子
动态规划
对于下标i而言,能勾勒出的最大面积是什么?
以i为中心, 向左寻找第一个小于height[i]的下标minLeftIndex, 向右寻找第一个小于height[i]的下标minRightIndex, 即最大面积 = height[i] * (minRightIndex - minLeftIndex - 1)
如示例1中,求i=4的最大面积
正向遍历数组 height 得到数组 minLeftIndex的每个索引值(第一小于当前柱子高度的索引值),反向遍历数组 height 得到数组minRightIndex(第一小于当前柱子高度的索引值)
完整代码:
public int largestRectangleArea(int[] heights) {
int[] minLeftIndex = new int[heights.length];
int[] minRightIndex = new int[heights.length];
// 记录每个柱子 左边第一个小于该柱子的下标
minLeftIndex