美文网首页
接雨水的算法题

接雨水的算法题

作者: 咯噔爸比 | 来源:发表于2021-01-11 11:33 被阅读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
    }
    
    思路 先算由左到右 ,直到遇到最大值,再算由右到左直到遇到最大值,求和即可。
    该思路也是我迭代了好几个版本想出来的。
    

    相关文章

      网友评论

          本文标题:接雨水的算法题

          本文链接:https://www.haomeiwen.com/subject/gpzraktx.html