84.柱状图中最大的矩形
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
这个题目的难度标注的是困难,不过感觉难度只有简单的水平,因为这道题目的暴力解法过于简单,时间复杂度在O(n^2)。但是巧妙的解法看了下官方解答才想到,最快的应该是用栈实现的时间复杂度在O(n),确实这种寻找当前位置数组与附近元素关系的题目可以用栈来实现速度较快。
思路
最大矩形面积固然就是要求出高和宽吧,这里的宽是我们要找的重点,高的话自然是数组中的每个值。于是就有了如下思路:
遍历数组的每个值作为高
从当前位置向左寻找
if 左边的数组值小于当前数组值
跳出向左搜索
else
宽度加一
从当前位置向右搜索
if 右边的数组值小于当前数组值
跳出向右搜索
else
宽度加一
记录最大宽度
代码实现
public class Problem84 {
public static void main(String[] args) {
int[] heights = {2,1,2};
System.out.println(new Solution().largestRectangleArea(heights));
}
}
class Solution {
public int largestRectangleArea(int[] heights) {
int maxArea = 0;
for(int i = 0; i < heights.length; i++)
{
int width = 1;
int left = i - 1;
int right = i + 1;
while(left >= 0)
{
if(heights[left] < heights[i])
{
break;
}else
{
width++;
}
left--;
}
while(right < heights.length)
{
if(heights[right] < heights[i])
{
break;
}else
{
width++;
}
right++;
}
maxArea = maxArea > heights[i] * width ? maxArea : heights[i] * width;
}
return maxArea;
}
}