84. 柱状图中最大的矩形 - 力扣(LeetCode) (leetcode-cn.com)
这道题我们先观察一下不难发现如下规律;
以heights[i]为高的最大矩形面积为
其中ri是下标k在i右边时最靠近i且满足heights[k]<heights[i]的下标k的值
le同理为左边的值
那么接下来就好办了,直接滑动窗口,但是这里又要求ri的值,所以我们可以利用reverse函数将数组倒置过来,间接求出ri
具体代码如下
const int N=100010;
class Solution {
public:
int le[N] = { 0 }, ri[N] = { 0 };
void getle(vector<int> a, int st[]) {
deque<int> que;//这里也可以用栈,但是我喜欢双端队列:D
que.push_front(0);
for (int i = 1; i < a.size(); i++) {//简简单单的滑动窗口
while (que.size() && a[que.back()] >= a[i])
que.pop_back();
if(que.size())st[i] = que.back();
que.push_back(i);
}
}
int max2(int a, int b) {
return a > b ? a : b;
}
int largestRectangleArea(vector<int>& heights) {
heights.insert(heights.begin(), -1);//前后插入一个足够小的数,用于消除边界问题
heights.push_back(-1);
getle(heights, le);
reverse(heights.begin(), heights.end());
getle(heights, ri);
reverse(heights.begin(), heights.end());
int max1 = -1;
for (int i = 1; i < heights.size() - 1; i++) {
max1 = max2(heights[i] * (heights.size() - ri[heights.size()-i-1]-1 -le[i]-1), max1);//因为ri数组的下标和数组都是相对倒置过的数组而言的,所以我们得转换一下
}
return max1;
}
};