LeetCode 42 Hard 收集雨水I Python

75 篇文章 0 订阅
72 篇文章 0 订阅

def trap(self, height):

    """

    My Method

    算法:左右指针

    思路:

        思路类似于407题,想象水从周围一点一点漫上去,涨起来~

            对某个位置i来说,其能容积多少水,取决于左右两侧的墙的高度重最小的那个高度

            而对整个容器来说,取决于整体两侧墙的最短的那个,所以设立左右指针left,right,哪侧墙矮就从哪侧

        来计算,left小就判断left和left+1的height,如果height[left] > height[left+1],那么就可以盛

        height[left]-height[left+1]这么多的水,并且要将height[left+1]更新为盛满水后的的高度,当然,

        如果height[left+1]本就大于等于height[left],自然就不用更新了,同理,对于右侧right部分也是做同样的

        计算,直至left >= right,因为left和right肯定要隔着1个,如果left == right,那left和right间就没有

        间隔了,就不该算了

    复杂度分析:

        时间:ON,遍历一次数组

        空间:O1,常数级

    """

    if height == []:

        return 0

    left = 0

    right = len(height) - 1

    result = 0

    while left < right:

        if height[left] <= height[right]:

            result += max(0, height[left] - height[left + 1])

            height[left + 1] = max(height[left], height[left + 1])

            left = left + 1

        else:

            result += max(0, height[right] - height[right - 1])

            height[right - 1] = max(height[right], height[right - 1])

            right = right - 1

    return result

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值