给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
题解:
1.包含n个非负整数的数组
2.元素值表示柱子高度
3.能拼接出来的最大矩形面积
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
解题思路:暴力搜索超时,单调栈优化
-
在柱高数组中找一个升序子序列,在这个子序列的后一个元素上其柱高度均比该子序列柱高要低,此时更新最大面积
-
这样在柱高数组后添加一个为0的柱高才能找出整个数组中的最优值
-
单调栈存放这个子序列的下标
-
注意栈为空和不为空时,矩形长高的计算;为空,此时子序列的后一个元素柱高位矩形高,长的值等于子序列后一元素的下标值;不为空则计算矩形长为子序列后一元素下标减此时柱高元素的前一下标减1(即此时形成的矩形的长)
C/C++题解:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> s; //单调栈记录遍历元素下标
int ans = 0; //记录最大面积
heights.push_back(0); //为寻找整个数组中形成的最大面积
for (int i = 0; i < heights.size(); ++i){
while (!s.empty() && heights[s.top()] >= heights[i])
{//找到一升序子序列,子序列后一元素值小于子序列最后元素
int h = heights[s.top()];
s.pop();//获取柱子高度代表矩形高度
if (s.empty()) //计算子序列中大于当前柱高度的
ans = max(ans, i * h);
else //下标计算矩形长度
ans = max(ans, (i - s.top() - 1) * h);}
s.push(i); }//向栈中写入柱子下标
return ans;}};
Debug结果:
Java题解:
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> s = new Stack<Integer>(); //单调栈记录遍历元素下标
int ans = 0; //记录最大面积
int[] height = new int[heights.length+1];
for(int i=0;i<heights.length;i++) {
height[i]=heights[i];
}//在数组末尾添加一个柱高为0的柱子,寻找整个数组中形成的最大面积
for (int i = 0; i < height.length; i++) {
while (!s.isEmpty() && height[s.peek()] >= height[i])
{//找到一升序子序列,子序列后一元素值小于子序列最后元素
int h = height[s.pop()];//获取柱子高度代表矩形高度
if (s.isEmpty()) //计算子序列中大于当前柱高度的
ans = Math.max(ans, i * h);
else //下标计算矩形长度
ans = Math.max(ans, (i - s.peek() - 1) * h);}
s.push(i); }//向栈中写入柱子下标
return ans; }}
Debug结果:
Python题解:
class Solution(object):
def largestRectangleArea(self, heights):
""" :type heights: List[int]:rtype: int"""
s = [] #单调栈记录遍历元素下标
ans = 0 #记录最大面积
heights.append(0) #为寻找整个数组中形成的最大面积
for i in range(len(heights)):
while s and heights[s[-1]] >= heights[i]:
#找到一升序子序列,子序列后一元素值小于子序列最后元素
h = heights[s[-1]]
s.pop()#获取柱子高度代表矩形高度
if not s: #计算子序列中大于当前柱高度的
ans = max(ans, i * h)
else: #下标计算矩形长度
ans = max(ans, (i - s[-1] - 1) * h)
s.append(i) #向栈中写入柱子下标
return ans
Debug结果:
更多题解移步公众号免费获取