文章目录
42. 接雨水
class Solution {
public:
int trap(vector<int>& height) {
stack<int> stk; // 栈用于保存柱子的索引
int n = height.size(); // 获取柱子的数量
int ans = 0; // 存储结果,最终返回接到的水量
// 遍历所有柱子
for (int i = 0; i < n; i++) {
// 当栈非空且当前柱子高度大于栈顶柱子的高度时
while (!stk.empty() && height[i] > height[stk.top()]) {
int middle = stk.top(); // 获取栈顶柱子的索引
stk.pop(); // 弹出栈顶元素,因为我们找到了一个可能的接水位置
// 确保栈非空,且可以确定左右边界
if (!stk.empty()) {
// 计算左右边界的高度,找到接水的高度
int h = min(height[stk.top()], height[i]) - height[middle];
// 计算接水的宽度
int w = i - stk.top() - 1;
// 计算并累加接水的量
ans += h * w;
}
}
// 将当前柱子的索引压入栈中
stk.push(i);
}
// 返回最终接到的水量
return ans;
}
};
求左边第一个比它大的数就是取出栈顶的下一个元素 因为栈里面是单调递增的
84.柱状图中最大的矩形
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
// 1. 边界条件:如果只有一个柱子,最大矩形面积就是这个柱子的高度
if(heights.size() == 1) return heights[0];
// 如果没有柱子,最大矩形面积为 0
if(heights.size() == 0) return 0;
// 2. 在高度数组的两端分别插入一个高度为 0 的柱子,避免栈空时需要额外的判断
heights.insert(heights.begin(), 0); // 插入 0 在开头
heights.push_back(0); // 插入 0 在末尾
stack<int> stk; // 栈用于存储柱子的索引
int ans = 0; // 用于记录最大矩形面积
int n = heights.size(); // 获取柱子数目,包括额外的两个 0
// 3. 遍历每一个柱子
for (int i = 0; i < n; i++) {
// 4. 栈中存储的是递增高度的柱子索引
// 当前柱子的高度小于栈顶柱子的高度时,开始计算矩形面积
while (!stk.empty() && heights[i] < heights[stk.top()]) {
int mid = stk.top(); // 获取栈顶元素的索引
stk.pop(); // 弹出栈顶元素
if (!stk.empty()) {
int h = heights[mid]; // 当前柱子的高度
int w = i - stk.top() - 1; // 计算宽度:从栈顶的下一个元素到当前位置的宽度
ans = max(ans, h * w); // 更新最大面积
}
}
// 5. 当前柱子高度大于栈顶柱子的高度,压入栈中
stk.push(i);
}
// 6. 返回最终计算的最大矩形面积
return ans;
}
};