- LeetCode 热题 100 - 两数之和
- 字母异位词分组
- 最长连续序列
- 移动零
- 盛最多水的容器
- 三数之和
- 接雨水
- 找到字符串中所有字母异位词
- 无重复字符的最长子串
- 和为 K 的子数组
- 滑动窗口最大值
接雨水
class 栈,数组,双指针,动态规划,单调栈给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
示例 2:
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
解法一:
说明:
要计算给定柱子高度图中的接雨水量,我们可以使用双指针的方法进行计算。这个问题通常被称为“接雨水问题”(Trapping Rain Water Problem)。
方法:双指针
算法步骤
初始化指针和变量:
左指针
left
指向数组的开始位置(索引 0)。右指针
right
指向数组的结束位置(索引n-1
)。初始化
left_max
和right_max
分别为柱子高度的初始左端和右端。初始化
water_trapped
变量为 0,用于存储总的接雨水量。遍历柱子高度数组:
如果
height[left]
小于等于height[right]
:否则:
如果
height[left]
大于等于left_max
,则更新left_max
。否则,计算当前位置能接的水量为
left_max - height[left]
,并将该水量累加到water_trapped
。移动左指针,即
left
增加 1。如果
height[right]
大于等于right_max
,则更新right_max
。否则,计算当前位置能接的水量为
right_max - height[right]
,并将该水量累加到water_trapped
。移动右指针,即
right
减少 1。当
left
小于right
时,进行以下操作:返回结果:
当循环结束时,
water_trapped
即为接雨水的总量。
算法实现
下面是用 Python 实现的代码:
示例
输入:
height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:
6
解释
在这个例子中,按照这种高度排列的柱子,经过雨水积累后,能够接住的雨水总量为 6
。
复杂度分析
时间复杂度:O(n),其中 n 是柱子高度数组的长度。我们只需遍历一次数组。
空间复杂度:O(1),除了存储变量外,不需要额外的空间。
这种方法有效地利用了双指针技巧,通过一次遍历即可完成对接雨水量的计算,是解决该问题的常用方法之一。
字数统计 |