接雨水的算法题

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

给定 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
}
思路 先算由左到右 ,直到遇到最大值,再算由右到左直到遇到最大值,求和即可。
该思路也是我迭代了好几个版本想出来的。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.问题描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。高...
    不辍居阅读 4,028评论 0 1
  • 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面...
    算法码上来阅读 5,048评论 0 0
  • 题目描述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。如下图...
    SaltyFishDmer阅读 4,044评论 0 0
  • 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上...
    huxinwen阅读 3,395评论 0 1
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 11,006评论 0 5