单调栈的应用,以及拆分思想

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

力扣上的一道题。

如果你想练习手写单调栈模版可以看看这篇文章单调栈模版-CSDN博客

当然这篇文章里我会使用STL里的stack。

试想一下,我们可以把题目中的数字具象化成一个个碗。

比如像这样

单调栈的应用,以及拆分思想_第1张图片

 

而21013这个大碗又可以分为两个小碗来计算

单调栈的应用,以及拆分思想_第2张图片 

所以我们只需要找到它的底边和高即可。

维护一个单调递减的栈,当遇到stack.top()cur,其中一个有效碗。

所以代码就是这样啦

class Solution {
public:
    int trap(vector& height) {
        int ans = 0;
        stack 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;
    }
};

你可能感兴趣的:(题目讲解)