题目
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析: 输入:height = [5,0,2,1,4,0,1,0,3] 输出:17 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
解读
思路:
黑色的看成墙,蓝色的看成青豆,柱子宽度皆为1,给定一个数组,每个数代表从左到右墙的高度,求出能装多少单位的青豆。也就是求图中蓝色正方形的个数。
整个流程为先求高度为1的青豆,再求高度为2的青豆,再求高度为3的青豆。
整个思路就是,求第 i 层的青豆,遍历每个位置,如果当前的高度小于i,并且两边有高度大于等于 i 的,说明这个地方一定有青豆,青豆就可以加1。
如果求高度为 i 的青豆,首先用一个变量 temp 保存当前累积的青豆,初始化为 0。从左到右遍历墙的高度,遇到高度大于等于i的时候,开始更新 temp。更新原则是遇到高度小于 i 的就把 temp 加 1,遇到高度大于等于 i 的,就把 temp 加到最终的答案 ans 里,并且 temp 置零,然后继续循环。
以题目的例子讲一下。
先求第1行的青豆。
也就是红色区域中的青豆,数组是 height = [ 5,0,2,1,4,0,1,0,3 ] 。
原则是高度小于 1,temp ++,高度大于等于 1,ans = ans + temp,temp = 0。
temp 初始化为 0,ans = 0
height[0] 等于 5 >= 1,开始更新 temp。
height[1] 等于 0 < 1,temp = temp + 1 = 1。
height[2] 等于 2 >= 1,ans = ans + temp = 1,temp = 0。
height[3] 等于 1 >= 1,ans = ans + temp = 1,temp = 0。
height[4] 等于 4 >= 1,ans = ans + temp = 1,temp = 0。
height[5] 等于 0 < 1,temp = temp + 1 = 1。
height[6] 等于 1 >= 1,ans = ans + temp = 2,temp = 0。
height[7] 等于 0 < 1,temp = temp + 1 = 1。
height[8] 等于 3 >= 1,ans = ans + temp = 3,temp = 0。
因此,第1行的青豆量为3,由图可知正确。
全部代码如下所示:(可以再改为连续输入)