当青训营遇上码上掘金
以示例图为例,输入数组为[5,0,2,1,4,0,1,0,3],输出为17,下面是我的代码片段,目前已经在码上掘金上发布: 整个思路就是,求第 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。
再求第 2 行的水。
数组是 height = [5,0,2,1,4,0,1,0,3] 。
原则是高度小于 2,temp ++,高度大于等于 2,ans = ans + temp,temp = 0。
temp 初始化为 0,ans 此时等于 3。
height[0] 等于 5 > 2,ans = ans + temp = 3,temp = 0。
height[1] 等于 0 < 2,temp = temp + 1 = 1。
height[2] 等于 2 >= 2,ans = ans + temp = 4,temp = 0。
height[3] 等于 1 < 2,temp = temp + 1 = 1。
height[4] 等于 4 >= 2,ans = ans + temp = 5,temp = 0。
height[5] 等于 0 < 2,temp = temp + 1 = 1。
height[6] 等于 1 < 2,temp = temp + 1 = 2。
height[7] 等于 0 < 2,temp = temp + 1 = 3。
height[8] 等于 3 >= 2,ans = ans + temp = 8,temp = 0。
然后结束循环,此时的 ans 就是8。
再看第 3 层。
数组是 height = [5,0,2,1,4,0,1,0,3] 。
原则是高度小于 3,temp ++,高度大于等于 3,ans = ans + temp,temp = 0。
temp 初始化为 0,ans 此时等于 8。
结束循环,此时的 ans 就是14。
再看第 4 层。
数组是 height = [5,0,2,1,4,0,1,0,3] 。
原则是高度小于 4,temp ++,高度大于等于 4,ans = ans + temp,temp = 0。
temp 初始化为 0,ans 此时等于 14。
结束循环,此时的 ans 就是17。
再看第 5 层。
数组是 height = [5,0,2,1,4,0,1,0,3] 。
原则是高度小于 5,temp ++,高度大于等于 5,ans = ans + temp,temp = 0。
temp 初始化为 0,ans 此时等于 8。
height[0] 等于 5,开始更新 temp,但是后边没有 height 大于等于 5 了,所以 ans 没有更新。
所以最终的 ans 就是 17。