原题链接:柱状图中最大的矩形
个人解法
思路:
这道题典型的单调栈问题,因为我们可以发现,如果求以某一个柱子为高,看它能扩展到的左右两个最远的边界构成的矩形,那么其实就是找以该柱子为起点,左边比它小的第一个数的位置,右边比它小的第一个数的位置。
对于找某个数左边比它小的第一个数,我们可以利用单调递增的栈来做。
时间复杂度: O ( n ) O(n) O(n)
代码:
class Solution {
public:
int left[100010];
int right[100010];
int largestRectangleArea(vector<int>& heights) {
int n = heights.size();
stack<pair<int, int>> stk;
for(int i = 0;i < n;i ++) {
while(stk.size() && stk.top().first >= heights[i]) stk.pop();
int t = stk.size() ? stk.top().second : -1;
left[i] = i - t - 1;
stk.push({heights[i], i});
}
stack<pair<int, int>>().swap(stk);
reverse(heights.begin(), heights.end());
for(int i = 0;i < n;i ++) {
while(stk.size() && stk.top().first >= heights[i]) stk.pop();
int t = stk.size() ? stk.top().second : -1;
right[i] = i - t - 1;
stk.push({heights[i], i});
}
reverse(left, left + n);
int res = 0;
for(int i = 0;i < n;i ++) res = max(res, (left[i] + right[i] + 1) * heights[i]);
return res;
}
};