タイトル42 LeetCodeブラシ雨水

所与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

出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/trapping-rain-water
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。

方法の一つ:暴力行為(タイムアウト) 

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        size = len(height)
        for i, h in enumerate(height):
            max_left = 0
            max_right = 0
        # 分别找第i列左右的最大高度值
            for j in range(i+1):
                max_left = max(height[j], max_left)
            for j in range(i,size):
                max_right = max(height[j], max_right)
        # 累加雨水高度
            ans += min(max_left, max_right) - height[i]
        return ans

 

方法2:動的プログラミング(補助アレイ)

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        size = len(height)
        if size == 0:
            return 0
        # 辅助数组:记录每个第i列的左右最高值
        max_left = [0]*(size)
        max_right = [0]*(size)
        max_left[0] = height[0]
        max_right[size-1] = height[size-1]

        for i in range(1, size):
            max_left[i] = (max(height[i], max_left[i-1]))
        for i in range(size-2, -1, -1):
            max_right[i] = max(height[i], max_right[i+1])
        for i in range(size):
            ans += min(max_left[i], max_right[i]) - height[i]
        return ans

 

公開された83元の記事 ウォン称賛14 ビュー30000 +

おすすめ

転載: blog.csdn.net/weixin_38121168/article/details/104192282