42. Trapping Rain Water(H)

題目描述

給定n個非負整數代表一個海拔的地圖,每個方塊的寬度爲1,計算在雨後,它能積攢的雨水的體積,原題如下,
這裏寫圖片描述
這道題看起來挺簡單的,但是一定要注意,這種題難度是Hard,肯定是不簡單的,一定要考慮清楚,自己的算法能否解決所有的情況,可以先自己舉幾個極端但簡單的例子試一下。
現在開始分析題意。這道題很想木桶裝水的問題,決定木桶容量大小的在於最短的板。而這道題就像是隻有兩塊板的木桶,能容量大小由短板來決定。比如圖中的第二個積水處,左邊的木板比右邊的木板矮,那麼就應該以左邊的木板爲標準,衡量水的體積。道理大概就是這個道理,現在我來描述下我的算法。
(建議結合代碼來看)既然我們是以比較矮的板爲標準,那麼我們肯定是希望能找到左板和右板中比較矮的那一塊,那麼我們就要從兩邊開始,同時向中間找。在向中間靠攏時,哪邊的板比較矮,那塊板就往中間靠,,同時記錄下邊界板的高度,在向中間靠的過程中,如果途中的板比邊界板更加矮,那麼我們就可以積水,就加上這兩塊板的高度差。如果比邊界板高,那麼則以新的板爲邊界板。直到左右的板到中間匯合爲止,代碼如下

class Solution {
public:
    int trap(vector<int>& height) {
        int l = 0, r = height.size()-1, edgeHeight = 0, sum = 0, lower;
        while (l < r) {
            if (height[l] < height[r]) { // 左板低於右板,則當前邊界爲左板,並把左板向中間移動
                lower = height[l];
                ++l;
            } else { // 否則,當前邊界爲右板,並把右板向中間移動
                lower = height[r];
                --r;
            }
            edgeHeight = max(edgeHeight, lower); // 設置邊界板的高度,若爲新的邊界,則edgeHeight == lower,不會積水
            sum += edgeHeight - lower;
        }
        return sum;
    }
};

PS:有不對或者不理解的地方歡迎提問,博主每天都會來瞄一眼~

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