leetcode題庫——接雨水
阿新 • • 發佈:2018-11-25
題目描述:
給定 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; } };
思路:
步驟主要分三部分:
- 計算從右向左遍歷時,每個位置的峰值
- 計算從左往右遍歷時,每個位置的峰值,並根據該位置的從右往左遍歷的峰值,計算出該位置的全域性峰值,即maxl和maxR中的較小者。
- 在第2步中,繼續根據得到的該位置的全域性峰值, 計算雨水量。