当青训营遇上码上掘金
很荣幸的参加了这次的字节青训营后端基础班,随着时间的推移,渐渐接近尾声,现在开始看到这个【青训营X码上掘金】中的主题4,发现其正是力扣42原题,真是令我狂喜,本以为要写一篇文章的我,瞬间感觉可以很轻松的完成
题目描述:攒青豆
现有n个宽度为1的柱子,给出n个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入: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代码