当青训营遇上码上掘金
「青训营 X 码上掘金」主题创作活动 代码创作
我来写 「青训营 X 码上掘金」主题创作活动-代码创作 攒青训营青豆啦
主题4:攒青豆
题目描述内容:现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
描述图片
案例解析:
以下为上图例子的解析:
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
简单分析:
青豆的个数计算:4 * 1+2 * 1+3 * 1+3 * 1+2 * 1+3 * 1 = 17
我们可以从题目描述中知道,柱的宽度一定为一,而每一列的青豆高度乘以柱宽即可得到青豆的数量,则我们可以得出一个简单的公式:
当前列的青豆值 = min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度
主要功能核心代码内容展示:
preMax[i] = max(preMax[i-1], height[i])
sufMax[i] = max(sufMax[i+1], height[i])
ans += min(preMax[i], sufMax[i]) - h
// golang没有int类型的min/max函数,需要用户自己实现
func min(x int, y int) int {
if x < y {
return x
}
return y
}
func max(x int, y int) int {
if x > y {
return x
}
return y
}
func function(height []int) int {
n := len(height)
ans := 0
preMax := make([]int, n)
preMax[0] = height[0]
for i := 1; i < n; i++ {
preMax[i] = max(preMax[i-1], height[i])
}
sufMax := make([]int, n)
sufMax[n-1] = height[n-1]
for i := n - 2; i >= 0; i-- {
sufMax[i] = max(sufMax[i+1], height[i])
}
for i, h := range height {
ans += min(preMax[i], sufMax[i]) - h
}
return ans
}
注:golang中没有min/max(int, int)函数,math包里面定义了min/max函数,但是是float64类型的,而并没有整数类型的min/max,需要我们自己去定义