题目地址: https://leetcode.cn/problems/trapping-rain-water/description/
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
// 思路:记录i位置左边最大值和右边最大值
// 当前位置的水量 = max(min(左边最大值,右边最大值) - 当前高度 , 0)
// 如果 min(左边最大值,右边最大值) - 当前高度 < 0。说明当前位置的高度最高没法接住水
func trap(height []int) int {
ans := 0
n := len(height)
lmax := make([]int, n)
rmax := make([]int, n)
lmax[0] = height[0]
rmax[n-1] = height[n-1]
for i := 1; i < n; i++ {
lmax[i] = max(lmax[i-1], height[i])
}
for i := n - 2; i >= 0; i-- {
rmax[i] = max(rmax[i+1], height[i])
}
for i := 0; i < n; i++ {
ans += max(min(rmax[i], lmax[i])-height[i], 0)
}
return ans
}
使用两个变量优化
func trap(height []int) int {
ans := 0
n := len(height)
lmax := height[0]
rmax := height[n-1]
l := 1
r := n - 2
for l <= r {
if lmax <= rmax {
ans += max(lmax-height[l], 0)
lmax = max(lmax, height[l])
l++
} else {
ans += max(rmax-height[r], 0)
rmax = max(rmax, height[r])
r--
}
}
return ans
}
8万+

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



