1. 程式人生 > >LeetCode 42. 接雨水

LeetCode 42. 接雨水

給定 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

演算法

用陣列 value 記錄比 value[0] 低的部分。從左向右遍歷,若當前點 height[i] 不低於 value[0] ,計算 value 中所有數值變為 value[0] 所帶來的雨水量,重置 value [height[i]] ;若 height[i]

低於 value[0] ,則加入 value 。遍歷結束後將剩下的  value 逆序再進行以上操作。

程式碼

def fun(height):
    """
    :type height: List[int]
    :rtype: int
    """
    def back(s):
        if len(s) <= 2:
            return 0
        value = []
        ans = 0
        for i, key in enumerate(s):
            if len(value) > 0 and key >= value[0]:
                ans += len(value) * value[0] - sum(value)
                value = [key]
            else:
                value.append(key)
        value.reverse()
        return ans + back(value)
    return back(height)