链接
- https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
分析
代码缺陷
- 使用大量的空间
- 并且求解当前位置的左右两边第一个小于当前位置高度的方法,十分粗暴
源代码
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
vector<int> l(heights.size(), -1);
vector<int> r(heights.size(), heights.size());
stack<int> s1;
stack<int> s2;
for (int i = 0; i < heights.size(); ++i) {
if (!s1.empty() && heights[i] > heights[s1.top()]) {
l[i] = s1.top();
}
while (!s1.empty() && heights[i] < heights[s1.top()]) {
r[s1.top()] = i;
s1.pop();
}
s1.push(i);
if (!s2.empty() && heights[heights.size()-i-1] > heights[s2.top()]) {
r[heights.size()-i-1] = s2.top();
}
while (!s2.empty() && heights[heights.size()-i-1] < heights[s2.top()]) {
l[s2.top()] = heights.size()-i-1;
s2.pop();
}
s2.push(heights.size()-i-1);
}
for (int i = 0; i < heights.size(); ++i) {
result = max(result, heights[i] * (r[i] - l[i] - 1));
}
return result;
}
};