当青训营遇上码上掘金

41 阅读2分钟

当青训营遇上码上掘金

作品链接

code.juejin.cn/pen/7188180…

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