欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 42. 接雨水

42. 接雨水

2024/10/24 19:15:29 来源:https://blog.csdn.net/huanxianxianshi/article/details/141962824  浏览:    关键词:42. 接雨水

题目:
在这里插入图片描述
思路

一根柱子的最大面积取决于柱子左右两条边的最小边
当前容水量 = 当前柱子最大面积 -自身(即阴影部分)

代码:

class Solution(object):def trap(self, height):""":type height: List[int]:rtype: int"""'''leftMax 代表每根柱子左边最高,rightMax代表每根柱子右边最高一根柱子的最大面积取决于柱子左右两边最短的那根此题一根柱子容水=最大面积-自身(即高度  阴影部分)'''# leftMax = []# rightMax = []# area = 0# lmax = 0# rmax= 0# for i in range(len(height)):#     lmax = max(lmax,height[i])#     leftMax.append(lmax)#     rmax = max(rmax,height[len(height)-1-i])#     rightMax.append(rmax)# for i in range(len(height)):#     area +=min(leftMax[i],rightMax[len(height)-1-i]) - height[i]# return area'''另一种解法  当leftMax>rightMax时,说明柱子的左边已暂时固定  此时从右边开始往左遍历依次计算每个柱子的容水量  直到leftMax=rightMax 才从左往右依次计算l<=r    l==r时也要计算当前柱子的容水量'''l = 0r = len(height)-1lMax = 0rMax = 0area = 0while l<=r:#当前柱子左、右的最大lMax = max(lMax,height[l])rMax =max(rMax,height[r])if lMax <=rMax:#一个柱子的最大高度取决于左、右两边area += lMax -height[l]l+=1else:area+=rMax - height[r]r-=1return area

第二种方法解释:只要记住 每次只需要考虑当前柱子,一根柱子的最大面积取决于柱子左右两条边的最小边
在这里插入图片描述
第一次遍历
此时当前柱子值height[0]=0, lmax(0,0) 最大为0 rmax(0,1) 最大为1
lmax<rmax:因为柱子最大面积取决于最小边 所有当前柱子最大面积为lmax , 此时这根柱子(列表第一个数)容水量=0-0=0 ,此时,我们要开始计算第二根柱子的容水量 即l+=1 也就是列表第二个
第二次遍历
当前柱子为列表第二个,height[1]=1, lmax(0,1) =1 rmax还是没变,为1
lmax==rmax, 当前柱子容水量 = min(1,1)-1=0 接着开始计算第三根柱子,即l向右移动
第三次遍历
当前柱子为列表第三个height[2]=0 , lmax(1,0) = 1 lmax<rmax,当前柱子容水量=1-0=1,接着开始计算第三根柱子,即l向右移动
第四次遍历
当前柱子height[3]=2,则lmax(1,2) = 2, lmax>rmax:此时可以确定的是从右边遍历柱子的时候,柱子左边的最大值已经确定了(在遍历到lmax<=rmax前),则当前柱子先不计算容量,这时从最右边开始往左遍历
此时,当前要计算柱子为height[-1] ,-1即right 。柱子最大面积取决于左边两边最小值 此时,当前柱子容水量=rmax-height[right] =1-1=0,此时继续往左遍历(直到rmax>=lmax),即 right-=1
第5次遍历
当前柱子为倒数第二个height[-2]=2,此时rmax(1,2)=2 , lmax=rmax,开始从height[3]计算,依此类推。。。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com