https://leetcode.cn/problems/trapping-rain-water/description/?envType=study-plan-v2&envId=top-100-liked
时间复杂度:O(n)
空间复杂度:O(1)
思路:
1. 定义两个指针,分别指向数组的最左边和最右边
2. 定义两个变量,分别记录当前位置左边和右边最高的柱子
3. 循环条件:左指针小于右指针
4. 如果左边较高,则移动左边指针,否则移动右边指针
5. 如果移动的左边柱子高度大于当前左边最高高度,则更新左边最高高度
6. 否则说明左边最高柱子高度小于当前左边最高高度,说明当前位置可以存储雨水,计算雨水高度
7. 右侧同理
func trap(height []int) int {
l, r := 0, len(height)-1
maxleft, maxright := height[l], height[r] // 当前位置左边和右边最高的柱子
res := 0
for l < r {
// 如果左边最高,则移动左边指针,否则移动右边指针
if height[l] < height[r] {
l++
// 如果移动的左边柱子高度大于当前左边最高高度,则更新左边最高高度
if height[l] > maxleft {
maxleft = height[l]
} else { // 否则说明左边最高柱子高度小于当前左边最高高度,说明当前位置可以存储雨水,计算雨水高度
res += maxleft - height[l]
}
} else {
r--
if height[r] > maxright {
maxright = height[r]
} else {
res += maxright - height[r]
}
}
}
return res
}
494

被折叠的 条评论
为什么被折叠?



