当青训营遇上码上掘金
作品链接
package main
import (
"fmt"
)
func main() {
var i = []int{5, 0, 2, 1, 4, 0, 1, 0, 3}
var count = 0
for len(i) > 1 {
if i[0] <= i[len(i)-1] {
var mArr []int
var allArr []int
for m, n := range i {
if n < i[0] {
count = count + i[0] - n
mArr = append(mArr, m)
allArr = append(allArr, 0)
} else {
if m != 0 {
allArr = append(allArr, n-i[0])
}
}
}
if len(mArr) == len(i)-2 {
fmt.Println(count)
break
} else {
i = allArr
}
} else {
context := i[0]
i[0] = i[len(i)-1]
i[len(i)-1] = context
}
}
}
我选择的创作主题是——主题四:攒青豆
问题描述
首先给出问题描述:
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
问题分析
其要求是在所给定的柱子中,把青豆放入,问能容纳的青豆数为多少。
那么首先可以确定的是,所能接住的青豆数与所给出的柱子的高度有关。当青豆在柱子所包围的区域中,所能容纳的青豆数和形成包围的最低的柱子相关。
根据这种思路,就可以考虑从所给出的柱子中,从两端开始,将两端的较低的柱子范围全部放上青豆,如果里面的柱子有比两端柱子中的最低柱子高的,就对其按照较低的柱子进行切割,得到一个新的柱范围,否则就将所填充的青豆数返回就是结果。之后一直重复这个操作,直到满足里面的柱子比两端柱子中的最低柱子都低的时候,就将所有的填充的青豆数进行一个加和然后返回结果。
代码分析
i | 输入的height切片 |
|---|---|
count | 能够接住的青豆数 |
mArr | 中间的柱子比两端柱子中较低柱低的柱子所在的索引 |
allArr | 按照两端柱子中较低柱进行切割后形成的新的height |