码上掘金——攒青豆

53 阅读2分钟

当青训营遇上码上掘金

解题的思路:

我采用的方法是按行遍历,然后根据每行有的青豆数累加起来,就是最终能够攒的青豆数。

按行遍历这个好办,通过比较各个柱子的高度来获取最大值即可(最大高度为row)。

而获取该行的青豆数时,首先我们得思考攒青豆,那么青豆存放的的地方可以是一个“盒子”对吧。那么一个“盒子”是不是得有左侧右侧两条边呢,而这两条边就是我们这里的柱子了。当我们在当前行(外层循环用作行遍历,i为行数),又进行按列遍历时(内层循环用作列遍历,j为列数),没有柱子那肯定就不用谈攒青豆了嘛(即height[j] < i),而如果有柱子(即height[j] >= i),那么也就预示着我们碰到这个盒子了,该开始数里面攒的青豆了。

但还有个关键,那就是我也不清楚到底有多少个攒着青豆的“盒子”啊。换言之,也就是存在着一个或多个“盒子”的情况。一个“盒子”固然好解决,但是多个“盒子”呢?诶,这时我们就可以采用“暂存和最终”的方法,即定义一个暂时存储青豆数的变量tempheight,一个最终的青豆数sum。tempheight用来当作我们当前这个盒子所存储的青豆数。而当我们再一次遇到height[j] >= i,即又碰上了一个柱子时,是不是也就意味着,我们当前的这个“盒子”包装起来了,该到下一个“盒子”了。那么我们就可以将tempheight的数目转给sum,然后归零,以便记录下个“盒子”所存储的青豆数,以此反复,那么多个“盒子”的情况我们也解决了。

到这里,我们的整体的思路其实也就差不多了。但是其实还有最后一个小小问题。我们说,没遇到柱子是不是height[j] < i这种情况,而当我们在数“盒子”里的青豆时,是不是也是height[j] < i这种情况,那两种情况重合,我们不就不知道到底什么时候是哪种情况了嘛。所以,为了区分,我们再加个变量flag,用来区分这两种情况,当flag为true时,就表明我们在数“盒子”的青豆,为false时,就表明还没碰到柱子。

综上,就是这道题的全部思路了。希望能给各位起到一点点的参考理解作用。