1. 程式人生 > >leetcode題庫——接雨水

leetcode題庫——接雨水

題目描述:

給定 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 len=height.size();
        if(len==0||len==1) return 0;
        int maxR[len];//記錄從右向左遍歷時,當前位置的峰值;
        int maxr=0;
        int rain=0;//記錄雨水量
        for(int r=len-1;r>=0;r--){//計算從右向左遍歷,每個位置的峰值
            if(height[r]>maxr){maxR[r]=height[r];maxr=height[r];}
            else maxR[r]=maxr;
        }
        int maxl=0;//記錄從左往右遍歷的峰值
        int MAX;//當前位置的全域性峰值
        for(int l=0;l<len;l++){//從左往右遍歷,一邊計算峰值,一邊計算雨量
            if(height[l]>maxl){maxl=height[l];}
            if(maxR[l]>maxl) MAX=maxl;//全域性峰值應該是當前位置上,從左往右遍歷的峰值和從右往左遍歷的峰值的較小的那個
            else MAX=maxR[l];
            rain+=MAX-height[l];//計算雨水量
        }
        return rain;
    }
};

思路:

步驟主要分三部分:

  1. 計算從右向左遍歷時,每個位置的峰值
  2. 計算從左往右遍歷時,每個位置的峰值,並根據該位置的從右往左遍歷的峰值,計算出該位置的全域性峰值,即maxl和maxR中的較小者。
  3. 在第2步中,繼續根據得到的該位置的全域性峰值, 計算雨水量。