【LeetCode - 每日1题】接雨水问题1
🌈 个人主页:(时光煮雨)
🔥 高质量专栏:vulnhub靶机渗透测试
👈 希望得到您的订阅和支持~
💡 创作高质量博文(平均质量分95+),分享更多关于网络安全、Python领域的优质内容!(希望得到您的关注~)
🌵目录🌵
- 难度 ⭐⭐⭐⭐⭐
- 题目回顾
- ✅解题思路
-
- 💖概述
- 💓核心思路
- ✅代码实现
- ✅代码分析
- ✅ 复杂度分析
- ✅ 测试用例验证
-
- ✅ 示例1
- ✅ 示例2
- ✅ 边缘用例
- 💖总结
- 🤝 期待与你共同进步
- 📚 参考文档
难度 ⭐⭐⭐⭐⭐
题目回顾
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例 2:
输入:height = [4,2,0,3,2,5]
输出:9提示:
- n == height.length
- 1 <= n <= 2 * 10**4
- 0 <= height[i] <= 10**5
✅解题思路
💖概述
本问题要求计算柱子排列后能接的雨水量。给定一个非负整数数组表示柱子的高度,每个柱子的宽度为1,需计算下雨后柱子之间能蓄积的雨水总量。核心在于确定每个位置上方能蓄积的雨水高度,该高度由该位置左右两侧最高柱子的较小值(即水位)减去当前柱子高度得到。
💓核心思路
采用双指针法,从数组两端向中间遍历:
- 初始化:左指针 left指向数组起始位置,右指针 right指向数组末尾,left_max和 right_max分别记录左右两侧遍历过程中的最大高度,ans记录总雨水量。
- 遍历过程:
- 更新 left_max为当前左指针高度与历史 left_max的较大值。
- 更新 right_max为当前右指针高度与历史 right_max的较大值。
- 比较 height[left]和 height[right]:
- 若 height[left] < height[right],说明左侧水位受限于 left_max,左指针位置可蓄积 left_max - height[left]的雨水,左指针右移。
- 否则,右侧水位受限于 right_max,右指针位置可蓄积 right_max - height[right]的雨水,右指针左移。
- 原理:移动较小高度的指针可确保当前指针位置的水位由该侧的最大高度决定(另一侧存在更高柱子),从而安全计算雨水量。
✅代码实现
from typing import Listclass Solution:"""双指针"""def trap(self, height: List