网站制作职业,wordpress某个页面全屏显示,中国网库企业黄页,用jsp做留言板网站题目
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图#xff0c;计算按此排列的柱子#xff0c;下雨之后能接多少雨水。 示例 1#xff1a; 输入#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出#xff1a;6 解释#xff1a;由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…题目
给定 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 0n len(height)dp [0] * ndp[0] height[0]left, right 0, 0ans 0while 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即可。