Leecode 0042. 接雨水
42. 接雨水
给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
示例 1:
1 | 输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] |
示例 2:
1 | 输入:height = [4,2,0,3,2,5] |
解题思路
核心思路是双指针边界,通过每个柱子能接住的雨水量取决于其左右两侧的最高柱子中较矮的那个(短板效应):
- 边界定义:
- 对于位置
i
,左侧最高柱子高度为left_max[i]
; - 右侧最高柱子高度为
right_max[i]
; - 位置
i
能接住的雨水量为min(left_max[i], right_max[i]) - height[i]
(若结果为正,否则为 0)。
- 对于位置
- 优化实现:
- 采用双指针法,无需额外存储
left_max
和right_max
数组,将空间复杂度降至 O (1); - 用
left
和right
指针分别从左右两端向中间移动; - 用
left_max
和right_max
记录当前左右侧的最高柱子高度; - 若
left_max < right_max
:左侧柱子能接的雨水由left_max
决定,移动左指针; - 否则:右侧柱子能接的雨水由
right_max
决定,移动右指针。
- 采用双指针法,无需额外存储
代码实现
1 | class Solution { |
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.