攒青豆(X)接雨水(√)

66 阅读2分钟

当青训营遇上码上掘金
很荣幸的参加了这次的字节青训营后端基础班,随着时间的推移,渐渐接近尾声,现在开始看到这个【青训营X码上掘金】中的主题4,发现其正是力扣42原题,真是令我狂喜,本以为要写一篇文章的我,瞬间感觉可以很轻松的完成

题目描述:攒青豆
现有n个宽度为1的柱子,给出n个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)

image.png

以下为上图例子的解析:

输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
如果是扣友,则不难发现这正是力扣42原题的包装,所以移步力扣(doge,当然不是。
思路:
黑色的看成墙,绿色的看成豆子,宽度一样,给定一个数组,每个数代表从左到右墙的高度,求出能装多少单位的水。也就是图中绿色正方形的个数。
因此只用从左遍历,得出左边最大的高度,从右边遍历,得出右边最大的高度,即雨水(不对,是豆子,的最终位置,然后每处最终位置减去开始的柱子位置得出豆子的添加值。
看下代码吧

package main

import "fmt"

func trap(height []int) (ans int){
  n :=len(height)
  if n==0 {
    return 
  }
  Lmax := make([]int,n)
  Lmax[0] = height[0]
  for i:=1 ; i<n ;i++ {
    Lmax[i]=max(Lmax[i-1],height[i])
  }
  Rmax :=make([]int,n)
  Rmax[n-1]=height[n-1];
  for i:=n-2 ; i>=0; i-- {
    Rmax[i]=max(Rmax[i+1],height[i])
  }
  for i,h:= range height{
    ans+=min(Lmax[i],Rmax[i])-h;
  }
  return
}
func max(x int,y int)int{
  if x < y {
    return y
  }
  return x
}
func min(x int,y int)int{
  if x < y  {
    return x
  }
  return y
}
func main() {
    //var height []
    // var st int
    // for {
    //   _ , t := fmt.Scan(&st)
    //   if t!= nil {
    //     break;
    //   }
    //     height=append(height,st);
    // }
    height:=[] int {5,0,2,1,4,0,1,0,3}
    fmt.Println(trap(height));
}

go代码