题目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;}
};