hot100第一道hard
解题思路
ai的思路还是很好的
注意要自己动手敲一遍,隔几天再复习,才能牢牢的掌握住
双指针
-
初始化变量:
ans
:用于存储最终的雨水量。left
:左指针,初始化为0。right
:右指针,初始化为height
列表的最后一个索引。premax
:左边的最大高度,初始化为0。sufmax
:右边的最大高度,初始化为0。
-
双指针遍历:
- 使用
left
和right
两个指针从两端向中间遍历。 - 在每一步中,更新
premax
和sufmax
,分别表示左边和右边的最大高度。 - 如果
premax
小于sufmax
,说明左边的最大高度决定了当前位置能接住的雨水量,因此计算premax - height[left]
并加到ans
中,然后将left
指针向右移动。 - 如果
premax
大于等于sufmax
,说明右边的最大高度决定了当前位置能接住的雨水量,因此计算sufmax - height[right]
并加到ans
中,然后将right
指针向左移动。
- 使用
-
返回结果:
- 当
left
指针超过right
指针时,遍历结束,返回ans
作为最终的雨水量。
- 当
代码实现
class Solution:
def trap(self, height: List[int]) -> int:
ans = left = premax = sufmax = 0
right = len(height) - 1
while left < right:
premax = max(premax, height[left])
sufmax = max(sufmax, height[right])
if premax < sufmax:
ans += premax - height[left]
left += 1
else:
ans += sufmax - height[right]
right -= 1
return ans
解释
-
premax
和sufmax
的作用:premax
记录了从左到右遍历过程中遇到的最大高度。sufmax
记录了从右到左遍历过程中遇到的最大高度。- 这两个变量帮助我们确定当前位置能接住的雨水量。
-
双指针的移动:
- 如果
premax
小于sufmax
,说明左边的最大高度决定了当前位置的雨水量,因此移动left
指针。 - 如果
premax
大于等于sufmax
,说明右边的最大高度决定了当前位置的雨水量,因此移动right
指针。
- 如果
通过这种方式,我们可以在一次遍历中计算出总的雨水量,时间复杂度为O(n),空间复杂度为O(1)。