題目描述:
給定 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;
}
};