当青训营遇上码上掘金
这是我参与「第五届青训营 」伴学笔记创作活动的第 N 天
攒青豆
「青训营 X 码上掘金」主题创作活动入营版 开启! - 掘金 (juejin.cn)
题目
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
思路
- 将空的地方看作高度为0的柱子
- 设每个柱子的高度为height数组, 能存放的豆子为mount数组
- 将豆子看成水,多余的豆子会从两侧“溢出”
- 递归求解
局部操作——填满
若发现: 1.左右两端柱子之间不再有柱子,则两根柱子的豆子数就为最矮的那根柱子的高度 2.若两根柱子之间有柱子,但这些柱子的高度都比左右两端的柱子矮,可以看作先填满,再挖去中间柱子的高度 设此填满操作为setMount
递归方法详解
0.设“统计所有柱子的豆子”这一操作为countMount
- 将左右边界下标设为l、r
- 找出边界之内(不含边界)最高的柱子,下标设为t
- 将会产生三种情况
-
- 若t比l和r都低,那就简单了,直接setMount(l,r)
- 若t比l高,比r低,那就由于t是中间最高的那根,不会再有比它更高的柱子了,所以setMount(t,r), 再递归countMount(l,t)
- 若t比l低,比r高,同2,对称过来即可
- 最后一种情况,t比l和r都高,那就对两边都递归就好了,即countMount(l,t),countMount(t,r)
代码链接
附:如有错误,恳请指正,侵权必删:D