接雨水的算法题

2021-01-11  本文已影响0人  咯噔爸比

前几天看到一个算法题就写了一下如下:

给定 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
}
思路 先算由左到右 ,直到遇到最大值,再算由右到左直到遇到最大值,求和即可。
该思路也是我迭代了好几个版本想出来的。
上一篇下一篇

猜你喜欢

热点阅读