42.接雨水
思路找到当前柱子左边第一个比它高的和右边第一个比它高的柱子进行计算,右边第一个比它搞得柱子可以循环遍历得到,左边第一个比它高的柱子就是栈中下一个元素
class Solution {
public:
int trap(vector<int>& height) {
stack<int> st;
int result = 0;
for(int i = 0; i < height.size(); ++i) {
while(!st.empty() && height[i] > height[st.top()]) {
int mid = height[st.top()];
st.pop();
if(!st.empty())
result += (min(height[i], height[st.top()]) - mid) * (i - st.top() - 1);
}
st.push(i);
}
return result;
}
};
84.柱状图中最大的矩形
思路:只要求出当前柱子左边第一个小于该柱子的下标,和右边第一个小于该柱子的下标,高度即为当前柱子的高度,宽度就是两个下标相减再减1
首尾添0
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
stack<int> st;
heights.insert(heights.begin(), 0);
heights.push_back(0);
int result = 0;
for(int i = 0; i < heights.size(); ++i) {
while(!st.empty() && heights[i] < heights[st.top()]) {
int mid = heights[st.top()];
st.pop();
if(!st.empty()) result = max(result, mid * (i - st.top() - 1));
}
st.push(i);
}
return result;
}
};
标签:第五十五,int,top,随想录,heights,height,柱状图,result,st
From: https://www.cnblogs.com/cscpp/p/18286748