码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 42 接雨水

时间:2020-05-05 17:51:31      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:情况下   最大   com   elf   style   ima   高度   max   rap   

给定 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 接雨水

标签:情况下   最大   com   elf   style   ima   高度   max   rap   

原文地址:https://www.cnblogs.com/BetterThanEver_Victor/p/12831413.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!