当青训营遇上码上掘金-主题四攒青豆

162 阅读2分钟

当青训营遇上码上掘金,针对于青训营主题四攒青豆,题目:

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

解题思路:每个柱子长短不齐,青豆洒下来会由一些隔断将青豆平在某个水平一致的高度。所以我们从低到高可发现规律。若柱子长度依次为[1,0,0,2,0,0,0,3,0,0,0,4]则会发现1与2之间青豆洒下来由1的高度决定,同理在两个差距柱之间青豆高度由较矮的柱子决定。当2-3之间不是0,为其他数值会发现,当2-3之间的数值不超过最短柱子2则不会对最终的青豆高度造成影响。若超过最短柱子高度2则会影响青豆所在水平高度。所以只需要找出不影响青豆的水平高度的柱子即可求解。

  1. 假设只有两颗柱子,数组头和尾,青豆高度由矮柱子决定。所以代码初期将判断数组的头尾高度,若头部矮于尾部则不动数组,若头部高于尾部则将数组逆转进而处理问题。
  2. 柱子从矮到高,若两颗柱子之间插入更高的柱子则会重新影响青豆高度,所以从第一颗柱子开始往后寻找比其高的柱子并记录所在位置,将整体分为若干小块青豆水平一致的隔断柱。
  3. 找到隔断柱对应位置后,将之间的距离乘两颗柱子中较矮柱子高度则为本能装下的青豆,以此算出所有若干隔断之间的面积,最后将隔断内的柱子所占面积减去即为最终的青豆数。即将原数组减去,认为每棵柱子的宽度为1,所以直接减去原数组则可将柱子所占面积减去,及算出最终青豆数量。

代码见code.juejin.cn/pen/7188047…