LeetCode 84 柱状图中最大的矩形
题目链接:https://leetcode.cn/problems/largest-rectangle-in-histogram/
思路:
要找到当前元素左边第一个比它小的和右边第一个比它小的,从而计算出矩形的宽度,矩形的高度就是当前元素的值。
所以可以用单调栈来完成任务,本题栈内元素应为单调递减
代码:
首尾为何加0?
首部加0是为了杜绝以下情况:[8,6,4,2]
首先是8在栈内,然后到元素6,因为元素6小于栈口元素(即8),此时应该跳到计算过程,然而计算过程中需要有三个数,当把栈内元素(8)弹出之后,栈变成了空栈,会出现操作空栈的情况,所以需要在首部加个0,避免此种情况。
尾部加0是为了杜绝以下情况:[2,4,6,8]
因为本身数组是单调递减的,所以加入到栈之后,栈中元素也是单调递减的:8,6,4,2](右边为栈底),这样的话就没有办法跳转到计算过程,因此需要在尾部加个0,从而使得可以进入到计算过程中。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int result = 0;
if(heights.empty()) return result;
// 防止出现在计算过程中出现空栈的情况
heights.insert(heights.begin(), 0);
heights.push_back(0);
stack<int>st;
st.push(0);
for(int i = 1; i < heights.size(); i++)
{
if(heights[i] >= heights[st.top()])
st.push(i);
else
{
while(!st.empty() && heights[i] < heights[st.top()])
{
int mid = st.top();
st.pop();
int left = st.top();
int w = i - left - 1;
result = max(w * heights[mid], result);
}
st.push(i);
}
}
return result;
}
};
总结
和接雨水的题目相类似
今日总结:
一刷代码随想录结束!