前几天看到一个算法题就写了一下如下:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
image.png
输入: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 个单位的雨水(蓝色部分表示雨水)。
代码go语言写的,效率还算不错
func trap(height []int) int {
total := 0
max_num := 0
max_index := 0
tem_num := 0
//sec_num := 0
for i, v := range height {
if i == 0 {
max_num = v
continue
}
if max_num <= v {
max_num = v
max_index = i
total += tem_num
tem_num = 0
} else {
tem_num += max_num - v
}
//fmt.Println(i, "===>", total)
}
s1 := height[max_index:]
tem_num = 0
if len(s1) > 1 {
for i := len(s1) - 1; i >= 0; i-- {
if i == len(s1)-1 {
max_num = s1[i]
continue
}
if max_num <= s1[i] {
max_num = s1[i]
total += tem_num
tem_num = 0
} else {
tem_num += max_num - s1[i]
}
}
}
return total
}
思路 先算由左到右 ,直到遇到最大值,再算由右到左直到遇到最大值,求和即可。
该思路也是我迭代了好几个版本想出来的。
网友评论