單調棧系列-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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章