Leetcode 42 接雨水
Posted 王文超BetterThanEver
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
方法1:
按列来看,找每一个列的左边最高值和右边最高值
动态规划思想:left_max[i]=max(left_max[i-1],height[i]) right_max[i]=max(right_max[i+1],height[i])
有关某个点的左右两个值得问题,都要这样做,与双指针有关系
class Solution:
def trap(self, height: List[int]) -> int:
res=0
#动态规划
left_max=[0 for x in range(len(height))]
right_max=[0 for x in range(len(height))]
for i in range(1,len(height)):
left_max[i]=max(left_max[i-1],height[i])
for j in range(len(height)-2,0,-1):
right_max[j]=max(right_max[j+1],height[j+1])
for k in range(1,len(height)-1):
res+=max(min(left_max[k],right_max[k])-height[k],0)
return res
方法2:双指针
从方法1中可以看出,left是左边的最大更新到最后结果中的,right是右边最大更新过来的
那么,如果最终结果与left有关系,那么肯定是左边最大很小的情况下
反之,右边最大很小
class Solution:
def trap(self, height: List[int]) -> int:
if not height or len(height)==0:return 0
res=0
left_max=height[0]
right_max=height[len(height)-1]
left=1
right=len(height)-2
while left<=right:
if left_max<max(height[right],right_max):
res+=max(left_max-height[left],0)
left_max=max(left_max,height[left])
left+=1
else:
res+=max(right_max-height[right],0)
right_max=max(right_max,height[right])
right-=1
return res
以上是关于Leetcode 42 接雨水的主要内容,如果未能解决你的问题,请参考以下文章