zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    存储过程
    sdsdsd
    sdsdd
    sdsd
    sdasd
    mysql触发
    c#连接mysql答题步骤
    c#mysql数据库
    nginx
    linux如何查看端口被何进程占用
  • 原文地址:https://www.cnblogs.com/BetterThanEver_Victor/p/12831413.html
Copyright © 2011-2022 走看看