class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
vector<int> st;//存放柱子下标
heights.insert(heights.begin(), 0);//哨兵
heights.push_back(0);//哨兵
for (int i = 0; i < heights.size(); ++i) {
while (!st.empty() && heights[i] < heights[st.back()]) {
int height = st.back();
st.pop_back();
int left = st.back() + 1;
int right = i - 1;
result = max(result, (right - left + 1) * heights[height]);
}
st.emplace_back(i);
}
return result;
}
};
代码(二刷看解析 2024年3月17日 双指针)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int size = heights.size();
vector<int> minLeftIndex(size);
vector<int> minRightIndex(size);
minLeftIndex[0] = -1;
for (int i = 1; i < size; ++i)
{
int t = i - 1;
while (t >= 0 && heights[t] >= heights[i]) t = minLeftIndex[t];
minLeftIndex[i] = t;
}
minRightIndex[size - 1] = size;
for (int i = size - 2; i >= 0; --i)
{
int t = i + 1;
while (t < size && heights[t] >= heights[i]) t = minRightIndex[t];
minRightIndex[i] = t;
}
int result = 0;
for (int i = 0; i < size; ++i)
{
int sum = heights[i] * (minRightIndex[i] - minLeftIndex[i] - 1);
result = max(sum, result);
}
return result;
}
};