单调栈系列-Leetcode 42. 接雨水

问题描述

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
在这里插入图片描述
示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

解题报告

维持一个 单调递减栈,当前元素大于栈顶元素时,如果栈中存在两个以上元素,就可以储水了。

实现代码

class Solution{
    public:
        int trap(vector<int>& height)
        {
            int ans = 0;
            stack<int> st;
            for (int i = 0; i < height.size(); i++)
            {
                while (!st.empty() && height[st.top()] < height[i])
                {
                    int cur = st.top();
                    st.pop();
                    if (st.empty()) break;
                    int l = st.top();
                    int r = i;
                    int h = min(height[r], height[l]) - height[cur];
                    ans += (r - l - 1) * h;
                }
                st.push(i);
            }
            return ans;
        }

// 作者:ikaruga
// 链接:https://leetcode-cn.com/problems/trapping-rain-water/solution/trapping-rain-water-by-ikaruga/
// 来源:力扣(LeetCode)
// 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
};

参考资料

[1] Leetcode 42. 接雨水
[2] 题解区:ikaruga

猜你喜欢

转载自blog.csdn.net/qq_27690765/article/details/106449419