力扣的接雨水解法(Python3)

力扣的接雨水解法

题目描述:
给定 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

参考程序1:

class Solution:
    def trap(self, height: List[int]) -> int:
        temp = 0
        height1 = 0
        height2 = 0
        for i in range(len(height)):
            height1 = max(height1,height[i])
            height2 = max(height2,height[-i-1])
            temp = temp + height1 + height2 -height[i]
        result=temp- len(height)*height1
        return  result

运行结果1:
在这里插入图片描述
参考程序2:

class Solution:
    def trap(self, height: List[int]) -> int:
        def BS(height_list):
            heightmax, result = 0, 0
            for cur_height in height_list:
                if cur_height >= heightmax:  # 这时候不存水
                    heightmax = cur_height
                else:  # 这时候存水
                    result = result + (heightmax - cur_height)
            return result
        indexmax = 0
        for i in range(len(height)):  # 找到最右边的最大值
            if height[i] >= height[indexmax]:indexmax = i
        indexmax = min(indexmax,len(height)-1)
        return BS(height[:indexmax+1]) + BS(reversed(height[indexmax+1:]))

运行结果2:
在这里插入图片描述
参考程序3:

class Solution:
    def trap(self, height: List[int]) -> int:
        if not height or len(height) < 3:
            return 0
        result = 0
        left, right = 0, len(height) - 1
        leftmax, rightmax = height[left], height[right]
        while left < right:
            leftmax, rightmax = max(height[left], leftmax), max(height[right], rightmax)
            if leftmax <= rightmax:
                result += leftmax - height[left]
                left += 1
            else:
                result += rightmax - height[right]
                right -= 1
        return result

运行结果3:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值