当青训营遇上码上掘金
原题 :现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
对于该题目的解法有很多,我最终选择了其中一种双指针解法,并使用python语言去编写代码。
算法思路
只有柱子之间形成低洼,才能产生出空间接住青豆。所以要通过分别遍历左右两侧的最高值,首先定义两个指针left跟right,分别指向给定的列表的左右端点,然后分别定义左侧最大值和右侧最大值为leftMax、rightMax,接着比较当前left跟right对应的值,确定两边指针中较矮的那一端,以此来计算可以在当前状态下可以接住的青豆数,遍历整个列表,最终实现青豆的计数。
数据分析
由于height列表中最左端对应的值是5,是列表中的最大值,所以leftMax的值始终是5,所以height[left] >= height[right]。则
right = 8, rightMax = 3,total = 0
right = 7, rightMax = 3,total = 3
right = 6, rightMax = 3,total = 5
right = 5, rightMax = 3,total = 8
right = 4, rightMax = 4,total = 8
right = 3, rightMax = 4,total = 11
right = 2, rightMax = 4,total = 13
right = 1, rightMax = 4,total = 17
right = 0, rightMax = 5,total = 17
不知道为什么码上掘金平台中Python3使用input()会报错,所以我只好将height设成定值(如果有大佬知道原因,劳烦在评论区告知,十分感激)。值得一提的是,该题原型是力扣42题的接雨水问题,里面还有很多种解法,感兴趣的朋友可以去看看。