用Python语言稳步分析实现:力扣热题 100题中高难度题,接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

分析思路

  1. 指针的移动策略:

    • 通过两个指针 leftright 从数组两侧向中间移动。
    • left_maxright_max 分别表示左侧和右侧的最大高度。
  2. 雨水的积累:

    • 首先初始化 leftright 为数组两端,初始化 left_maxright_max 为 0。
    • 在每一步迭代中,比较 left_maxright_max,选择较小的那个作为当前高度的最大高度。
    • 如果 left_max 小于 right_max,说明左侧的最大高度小于右侧,此时可以计算左侧的雨水,并将 left 指针向右移动。
    • 如果 right_max 小于等于 left_max,说明右侧的最大高度小于等于左侧,此时可以计算右侧的雨水,并将 right 指针向左移动。
  3. 雨水的计算:

    • 在每一步迭代中,通过比较 left_maxright_max 的较小值,可以确定当前位置的最大高度。
    • 如果当前位置的高度小于最大高度,说明可以积累雨水,将积累的雨水量累加到 result 中。
  4. 迭代的结束条件:

    • leftright 相遇时,迭代结束。
  5. 时间复杂度:

    • 由于只需要一次遍历数组,时间复杂度是 O(n),其中 n 是数组的长度。
  6. 空间复杂度:

    • 除了常数个变量外,没有使用额外的空间,空间复杂度是 O(1)。                                

代码实现:

class Solution(object):

    def trap(self, height):

        """

        :type height: List[int]

        :rtype: int

        """

        if not height or len(height) < 3:

            return 0



        left, right = 0, len(height) - 1

        left_max, right_max = 0, 0

        result = 0



        while left < right:

            # 更新左侧最大高度

            left_max = max(left_max, height[left])

            # 更新右侧最大高度

            right_max = max(right_max, height[right])



            if left_max < right_max:

                # 如果左侧最大高度小于右侧,计算左侧的雨水并将左指针向右移动

                result += left_max - height[left]

                left += 1

            else:

                # 如果右侧最大高度小于等于左侧,计算右侧的雨水并将右指针向左移动

                result += right_max - height[right]

                right -= 1



        return result

运行实例:

# 示例
height1 = [0,1,0,2,1,0,1,3,2,1,2,1]
height2 = [4,2,0,3,2,5]

solution = Solution()
print(solution.trap(height1))  # 输出:6
print(solution.trap(height2))  # 输出:9



 

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科技新华脉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值