当青训营遇上码上掘金
本文介绍 青训营 X 码上掘金活动第四题 “攒青豆” 的解法。
原题目: 现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
这个问题和“接雨点”是同一个问题。
主要的解决思想是:
- 拆成子问题,即每次求解每个索引位置对应可以存储多少豆子,加起来就是整个系统可以接收的豆子的总数。
- 每个索引位置可接受的豆子数量 = 短板高度 - 自身柱子的高度;所谓短板高度是指其左右两边决定其最多可以存多少的较短的柱子的高度
所以我们每算一个位置可以存多少的时候,就要去找 当前影响当前位置存多少的短板的高度
这里我们使用双指针法: 左右开弓,一起向中间进发
先初始化要用到的变量:
然后左右指针开始向中间移动:
每次循环开始,我们先去维护一下,左右两边的最大值。这两个最大值对应的最小值就是我们当前索引位置要找的短板值。
欸,你肯定要问了?不对啊,我们当前索引是谁啊?lindex还是rindex呢?
这里的思路就是,哪边小,我们就把哪边当成当前的索引,去算这个位置的存储量。为啥呢?因为我们要找的是这个短板,哪边小,说明这个短板就是那边那个索引。而大的那边呢,我们可以不管,等轮到它小的时候,才说明他要派上用场了。
试一下结果
enjoy :)