当青训营遇上码上掘金
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
下面是go语言代码实现:
定义一个n为height数组的长度。如果height的长度为0,就返回0。 再定义两个指针left和right,分别指向数组的开头和结尾。定义lMax和rMax,分别为左指针和右指针所在位置左边和右边的最大高度。初始时,lMax和rMax分别被初始化为数组第一个元素和最后一个元素。定义一个变量result,用来记录接住的青豆数,初始值为0。
先判断当前的lMax和rMax的大小关系。如果lMax小于等于rMax,将left向右移动一位,如果移动后的当前高度大于等于lMax,如果大于等于lMax,就更新lMax的值;如果小于lMax,就计算当前高度与lMax之差,并将差值加到result中。
如果rMax小于lMax,就将右指针right向左移动一位,如果移动后的当前高度大于等于rMax,如果大于等于rMax,则更新rMax的值;如果小于rMax,则计算当前高度与rMax之差,并将差值加到result中。
left和right碰到时, lMax <= rMax,左边没有空间,就更新 lMax 即可。如果左边的高度大于 lMax,则左边有空间,,高度为 lMax - height[left]。计算完毕后,将左指针向右移动。