題目
給定 n 個非負整數表示每個寬度爲 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。
上面是由數組 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度圖,在這種情況下,可以接 6 個單位的雨水(藍色部分表示雨水)。
示例:
輸入: [0,1,0,2,1,0,1,3,2,1,2,1]
輸出: 6
思路
基於動態規劃(Dynamic Programming)的方法;
首先,維護一個一維的 dp 數組,這個 DP 算法需要遍歷兩遍數組,第一遍在 dp[i] 中存入i位置左邊的最大值;
然後,開始第二遍遍歷數組,遍歷時找右邊最大值;
最後,和左邊最大值比較取其中的較小值,然後跟當前值 A[i] 相比,如果大於當前值,則將差值存入結果。
C++代碼
class Solution {
public:
int trap(vector<int>& height)
{
int res = 0, mx = 0, n = height.size();
vector<int> dp(n, 0);
for (int i = 0; i < n; ++i)
{
dp[i] = mx;
mx = max(mx, height[i]);
}
mx = 0;
for (int i = n - 1; i >= 0; --i)
{
dp[i] = min(dp[i], mx);
mx = max(mx, height[i]);
if (dp[i] > height[i])
res += dp[i] - height[i];
}
return res;
}
};