python每日一题——7接雨水

题目

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [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 个单位的雨水
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9

答案

这个问题可以通过动态规划来解决。我们可以定义一个dp数组,dp[i]表示从第0个柱子到第i个柱子所能接到的最大雨水量。对于每个柱子,如果它比前一个柱子高,那么它上面的雨水量就是它自身的高度,否则就是0。因此,我们可以得到状态转移方程:

dp[i] = max(dp[i-1], height[i])

其中dp[i-1]表示不接第i个柱子上的雨水量,height[i]表示接第i个柱子上的雨水量。最后,dp数组中的最大值就是所能接到的最大雨水量。

以下是Python代码实现:

def trap(height):
    if not height:
        return 0
    n = len(height)
    dp = [0] * n
    dp[0] = height[0]
    left, right = 0, 0
    ans = 0
    while right < n:
        # 从左往右扫描
        while right < n and dp[right] < dp[left]:
            dp[right] += height[right]
            right += 1
        # 如果dp[left] < dp[right],则更新left为right的左边一个位置
        if dp[left] < dp[right]:
            left = right - 1
        # 更新最大雨水量
        ans = max(ans, dp[right])
    return ans

在这个代码中,我们使用了一个dp数组来存储每个位置所能接到的最大雨水量。left和right分别表示扫描的左右边界,ans表示目前为止所能接到的最大雨水量。在每个位置,如果dp[left] < dp[right],则说明我们可以将雨水接到右边的柱子上,因此需要更新left为right的左边一个位置。最后,返回ans即可。

你可能感兴趣的:(算法练习,python,算法,leetcode)