攒青豆问题的求解

97 阅读2分钟

青训营遇上码上掘金,我们一边敲代码一边攒青豆。

代码:code.juejin.cn/pen/7188835…

  “攒青豆”问题,即对于一个凹凸不平的“坑”,往里面撒青豆。两侧没有格档的青豆会掉落,根据给出的每面墙的高度,求最多可容纳的青豆数。

  我的第一思路是求两侧墙的高的的最小值作为青豆最高高度,然后求中年每一列可容纳的青豆数。然后三下五除二就写完了,但是输入测试数据后,猫猫被啪啪打脸,555.

  很明显,我没有考虑中间有两堵更高的墙可以容纳更多青豆的情况,因此我改变思路:首先求出最高的那面墙的高度,然后从第一层开始,从左右两边向中间行进,找到这一层有墙的那一列,求这一层这两列中间能容纳多少青豆。然后到第二层,从上一层确定的边界开始向中间寻找(因为两侧不可能容纳青豆了),求新的两列中间能容纳多少青豆……依次类推,直到最高的一层。

  在求得每层可以容纳青豆的范围时,首先让上一层的l(从左到右第一个有墙的那一列的列数)自增,结束条件为小于等于上一层的r(从右到左第一个有墙的列的列数)或找到墙,无需遍历到头,然后使用类似方法求本层的r……

  到写文章的时候,我在想有没有可以改进的地方。比如,当某一层的有墙的那一列重合的时候,说明上面的几层里只有一面墙了,此时可以提前结束循环;在添加这一种结束循环的方案后,也无需计算最高的墙的高度了。

  以上只是我这只小猫咪的思路,希望可以抛砖引玉,听到大佬的思路(≧^.^≦)喵~