1、题目描述:
2、题解:
方法1:单调栈
思路:
设定一个栈,保存数组的下标(遍历过程中,顶底到栈顶的值所对应的heights数组中的值是递增的。)
把原数组的前后增加0值,这样后面就不用判断栈是否是空
然后循环遍历数组:
循环处理,如果当前的高度小于栈顶所对应heights数组的的值:
取出栈顶元素,计算取出的栈顶元素所对应的heighs值h
计算宽度:distance = i - stack[-1] - 1
更新res,res = max(res,h * distance)
当前下标入栈
返回res
Python实现:
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
#单调栈
res = 0
heights = [0] + heights + [0]
stack = []
stack.append(0)
for i in range(1,len(heights)):
while heights[i] < heights[stack[-1]]:
h = heights[stack.pop()]
distance = i - stack[-1] - 1
res = max(res,h * distance)
stack.append(i)
return res
C++实现:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
//单调栈
int res = 0;
stack<int> st;
heights.insert(heights.begin(),0);
heights.push_back(0);
st.push(0);
for (int i = 1;i < heights.size();i++){
while (heights[i] <= heights[st.top()]){
int h = heights[st.top()];
st.pop();
if (st.empty()){
break;
}
int distance = i - st.top() - 1;
res = max(res,h * distance);
}
st.push(i);
}
return res;
}
};
双指针 | 动态规划 | 单调栈:力扣42. 接雨水
单调队列 | 滑动窗口 | 动态规划:力扣239. 滑动窗口最大值
3、复杂度分析:
时间复杂度:O(N)
空间复杂度:O(N)