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 hSize = height.size();
        if(hSize <= 2)
            return 0;
        
        int maxLeft = height[0], maxRight = height[hSize-1], i = 1, j = hSize - 2, ret = 0;
        while(i <= j){
            if(maxLeft < maxRight){//從左邊開始蓄水
                if(height[i]>maxLeft)//更新最大高度
                    maxLeft = height[i++];
                else//更新儲水量,因爲右邊有一個大的值兜着,所以不用擔心
                   ret += maxLeft - height[i++];
            }
            else{
                if(height[j]>maxRight)
                    maxRight = height[j--];
                else
                    ret += maxRight - height[j--];
            }
        }
        
        return ret;
    }
};

 

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