Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务活动详情
一、题目描述
给定一个柱状图,用n个数字表示,每个柱子宽度为1,求图中最大的矩形面积。
数据范围
n <= 100000, h[i] <= 10000
二、思路分析
朴素想法: 暴力二重循环,但是这样子复杂度太高了,浪费复杂度的地方在于对于每个柱子,找它的最左最右的柱子要花很多时间。
不朴素想法: 采用单调栈的做法,维护一个单调递增的栈,当某个柱子要出栈的时候,它一定是遇到了它右边第一个比它小的柱子(把它卡住了),同时因为单调栈的性质,它自身前一个元素就是它左边第一个比它小的柱子(比它高的被它自己给出栈出光了)。所以每当一个柱子出栈的时候,就能够计算以它为矩形“中心”的最大面积了。
三、AC代码
class Solution {
public:
int l,r,ans=0;
vector<int > f;
int largestRectangleArea(vector<int>& heights){
heights.push_back(0);
int n = heights.size();
for (int i = 0; i < n; i++) {
while (!f.empty() && heights[f.back()] > heights[i]) {
int now = f.back();
f.pop_back();
if (f.empty()) l=0;
else l = f.back() + 1;
r = i - 1;
ans = max(ans, (r-l+1) * heights[now]);
}
f.push_back(i);
}
return ans;
}
};
四、总结
注意观察题目,利用单调栈的性质去维护柱子,避免了重复计算。