&LeetCode0042& 接雨水

題目

給定 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章