Leetcode 接雨水

hot100第一道hard

解题思路

ai的思路还是很好的
注意要自己动手敲一遍,隔几天再复习,才能牢牢的掌握住
双指针

  1. 初始化变量

    • ans:用于存储最终的雨水量。
    • left:左指针,初始化为0。
    • right:右指针,初始化为height列表的最后一个索引。
    • premax:左边的最大高度,初始化为0。
    • sufmax:右边的最大高度,初始化为0。
  2. 双指针遍历

    • 使用leftright两个指针从两端向中间遍历。
    • 在每一步中,更新premaxsufmax,分别表示左边和右边的最大高度。
    • 如果premax小于sufmax,说明左边的最大高度决定了当前位置能接住的雨水量,因此计算premax - height[left]并加到ans中,然后将left指针向右移动。
    • 如果premax大于等于sufmax,说明右边的最大高度决定了当前位置能接住的雨水量,因此计算sufmax - height[right]并加到ans中,然后将right指针向左移动。
  3. 返回结果

    • left指针超过right指针时,遍历结束,返回ans作为最终的雨水量。

代码实现

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = left = premax = sufmax = 0
        right = len(height) - 1
        while left < right:
            premax = max(premax, height[left])
            sufmax = max(sufmax, height[right])
            if premax < sufmax:
                ans += premax - height[left]
                left += 1
            else:
                ans += sufmax - height[right]
                right -= 1
        return ans

解释

  • premaxsufmax的作用

    • premax记录了从左到右遍历过程中遇到的最大高度。
    • sufmax记录了从右到左遍历过程中遇到的最大高度。
    • 这两个变量帮助我们确定当前位置能接住的雨水量。
  • 双指针的移动

    • 如果premax小于sufmax,说明左边的最大高度决定了当前位置的雨水量,因此移动left指针。
    • 如果premax大于等于sufmax,说明右边的最大高度决定了当前位置的雨水量,因此移动right指针。

通过这种方式,我们可以在一次遍历中计算出总的雨水量,时间复杂度为O(n),空间复杂度为O(1)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值