LeetCode 42.接雨水 【双指针】
程序员文章站
2022-06-28 22:19:02
...
接雨水
题目链接
https://leetcode-cn.com/problems/trapping-rain-water/
题目说明
题解
主要方法:双指针 + 正反遍历
解释说明:
1. 正向遍历:先确定池子左墙初始化为第一个bar,从第 2 个 bar 开始遍历右墙,同时记录中间的 bar 高度和,当右墙大于等于左墙的时候就有第一滩积水了,[左右墙距离 * 左墙高度 - 中间 bar 和] 就是这滩积水的体积,同时将右墙认定为下一个左墙,同时重新记录bar高度和。
2. 反向遍历:和正向遍历一样,先确定池子右墙初始化最后一个 bar,从后往前遍历左墙,条件限定于大于右墙,(等于的情况表示池子左右高度相同,记录一次就可以了)
代码示例:
class Solution:
def trap(self, height: List[int]) -> int:
size = len(height)
# 确定池子左墙,找大于等于左墙的右墙,并记录中间bar的累计和
ans = left = block = 0
for right in range(1, size):
if height[right] >= height[left]:
ans += (right - left - 1) * height[left] - block
left, block = right, 0
else:
block += height[right]
# 确定池子右墙,找大于右墙的左墙,并记录中间bar的累计和
right, block = size - 1, 0
for left in range(size - 2, -1, -1):
if height[left] > height[right]:
ans += (right - left - 1) * height[right] - block
right,block = left, 0
else:
block += height[left]
return ans
推荐阅读
-
[LeetCode] 四数和值问题类型总结(哈希、双指针)
-
#leetcode刷题之路42-接雨水
-
LeetCode 19. 删除链表的倒数第N个节点(双指针和递归的妙用)
-
Leetcode125. 验证回文串--双指针、内置函数
-
【LeetCode18】【双指针】每日一题day32
-
leetcode-42-接雨水-java
-
LeetCode 42.接雨水 【双指针】
-
LeetCode 209. 长度最小的子数组(两种解法)(贪心 + 双指针)—— JavaScript
-
LeetCode分类刷题之双指针(首尾指针)
-
【亡羊补牢】挑战数据结构与算法 第76期 LeetCode 11. 盛最多水的容器(双指针)