【Leetcode | Python】42. 接雨水 [栈][数组][双指针][动态规划][单调栈]

🚀总结

  • 对于每一个柱子,它所能接到的雨水量并不取决于它相邻左右两侧的柱子高度,而取决于它【左右两侧的最高的柱子高度】;
  • 类似于 11. 盛最多水的容器,由于“短板效应”,每个柱子的接水量取决于它左右两侧最高的柱子中较矮的那一个;
  • 使用对向双指针,遍历的同时,完成:
    • 判断哪边是短板;
    • 根据短板计算当前柱子的接水量;
    • 将短板向内移动;
    • 更新当前左右两侧最高的柱子高度。

📇题目

在这里插入图片描述

⭐思路

  1. 初始化:左指针初始化为数组第一个位置,右指针初始化为数组最后一个位置;左侧最高点初始化为左指针为数组第一个高度,右侧最高点初始化为数组最后一个高度;
  2. 只要左右指针还没有重复:
    • 判断当前的短板是哪边(根据左右两侧最高点);
    • 根据短板计算当前柱子可接雨水量;
    • 短板向内移动;
    • 判断是否需要更新短板高度;
  3. 返回最终结果

🛠️代码

class Solution:
    def trap(self, height: List[int]) -> int:
        res = 0  # 最终结果
        l = 0  # 初始化左指针
        r = len(height) - 1  # 初始化右指针
        left_max = height[l]  # 初始化左侧最高点
        right_max = height[r]  # 初始化右侧最高点
        while l < r:
            if left_max > right_max:  # 如果左侧最高点高于右侧最高点,右侧是短板
                res += right_max - height[r]  # 可接水面积是右侧短板 - 当前右指针高度
                r -= 1  # 右指针左移
                if height[r] > right_max:  # 如果当前高度大于右侧最高点
                    right_max = height[r]  # 更新右侧最高点
            else:
                res += left_max - height[l]
                l += 1
                if height[l] > left_max:
                    left_max = height[l]
    
        return res
  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值