题目1:42 接雨水
题目链接:42 接雨水
题意
n个宽度为1高度不一致的柱子排列,可以接多少雨水
找寻当前柱子的左面第一个比该柱子高的(栈顶的下一个元素),右面第一个比该柱子高的(当前遍历的元素),作差 得到宽度(下标作差)和高度(元素作差)
代码
class Solution {
public:
int trap(vector<int>& height) {
int sum = 0;
stack<int> st;
st.push(0);
for(int i = 1; i < height.size(); i++){
if(height[i] <= height[st.top()]){
st.push(i);
}else {
while(!st.empty() && height[i] > height[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
int h = min(height[i], height[st.top()]) - height[mid];
int w = i - st.top() - 1;
sum += h * w;
}
}
st.push(i);
}
}
return sum;
}
};
题目2:84 柱状图中的最大矩形
题目链接:84 柱状图中的最大矩形
题意
求n个不同高度宽度为1的柱子勾勒出的最大面积
找到左面比当前柱子矮的,右面比当前柱子矮的作差得到宽(下标作差),当前柱子高度为高
需要在数组的头部和尾部加上0,这样所有的柱子都能求一次对应的勾勒出的面积
伪代码
代码
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int s = 0;
stack<int> st;
heights.insert(heights.begin(), 0);
heights.push_back(0);
st.push(0);
for(int i = 1; i < heights.size(); i++){
if(!st.empty() && heights[i] >= heights[st.top()]){
st.push(i);
}else {
while(!st.empty() && heights[i] < heights[st.top()]){
int mid = st.top();
st.pop();
if(!st.empty()){
int h = heights[mid];
int w = i - st.top() - 1;
s = max(h*w, s);
}
}
st.push(i);
}
}
return s;
}
};