使用栈解决计算青豆体积(第五届青训营主题四)

89 阅读2分钟

当青训营遇上码上掘金 image.png 从题目的图中可以看出来,当存在两个柱子高于中间的高度的时候,就计算两个柱子中间的青豆体积,例如图中的5和2之间,将计算青豆的体积为min(5,2)*(3-1-1)=2。2和4之间也是同样,这就可以想到其实在计算体积的时候,先将第一个柱子入栈,数组下标加一,当碰到比这个柱子要矮的或者相同高度的柱子就将这个柱子入栈,当碰到比上一个柱子要高的柱子,则说明上一个柱子可能存在积水,将上一根柱子出栈,然后再比较上上根柱子(出栈后的栈顶)和当前柱子的高度,如果当前柱子的高度小于等于上上根柱子,则停止出栈,否则继续出栈。以题目中的例子来进行讲解:

第一步:将5的数组索引入栈,此时栈中的元素为[0]

第二步:比较5和0大小,5>0,将0的索引入栈,栈中的元素为[0,1]

第三步:比较2和height[1]=0的大小,2>0,开始出栈,出1,栈中剩余[0],比较2和height[0]=5的大小,2<5,停止出栈,计算能够盛的豆子,tmp=(2-0-1) * (min(5,2)-0)=2,sum=sum+tmp=2 + 0 = 2。此时栈中的元素为[0],将2入栈,此时栈中的元素为[0,2]

第四步:比较height[3]和height[0]的大小,1<5,将3入栈,此时栈中的元素为[0,2,3]

第五步:比较height[4]和height[3]的大小,4>1,开始出栈出3,栈中剩余[0,2],计算能够盛豆子的体积,tmp=(min(4,2)-1) * (4-2-1) = 1, sum = sum +tmp = 3, 比较height[2]和height[4],接着出栈,此时计算tmp = 4,sum = 7,栈中的元素为[0]

...

第n步:当当前为height中最后一个元素,停止循环。

题目中存在一种情况,[4,0,5,1,5,0,1],即在第三步时,栈中元素全部出栈,此时也停止循环,将当前位置入栈,开启下一步。 代码见code.juejin.cn/api/raw/718…