给定 n
个非负整数表示每个宽度为 1
的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5]
输出:9
提示:
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
能想到这么做,但是要跟大家讲出来。可能会有点困难。我不知如何描述。
假设每个元素都是单调递增的话。下雨的时候就会流走。但是单调递减的话,遇到前一个比后一个高那么就撞墙了。这时就可以计算能盛水容量。因为单调性被破坏。那么前一个大于后一个满足单调性继续往后走。
直接上代码
package main
import "fmt"
func main(){
ans := 0
heights := []int{0 , 1, 0 ,2, 1, 0 , 1, 3, 2 ,1, 2, 1}
type Rect struct{
Width int
Height int
}
for key := range heights{
height := heights[key]
wc := 0
//栈顶元素与当前元素,条件不满足,单调性破坏
for len(stack) > 0 && stack[len(stack) - 1].Height <= height{
//弹栈
top := stack[len(stack) -1]
stack = stack[len(stack) - 1]
bottom := top.Height
wc += top.Width
if len(stack) <= 0 {
continue
}
up := height
if stack[len(stack) - 1].Height < height{
up = stack[len(stack) - 1].Height
}
//更新答案
ans += wc * (up - bottom)
}
//入栈
stack = append(stack, Rect{
Width: wc + 1,
Height : height,
})
}
fmt.Println(ans)
}