代码随想录算法训练营第五十五天 | 42.接雨水 84.柱状图中最大的矩形

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;
    }
};
posted @ 2024-07-05 23:03  深蓝von  阅读(1)  评论(0编辑  收藏  举报