话说在前
当青训营遇上码上掘金,我们在此相遇,这是我在掘金刚注册发的第一篇文章,希望我将在掘金平台和大家一起成长,学习和分享知识。接下来我将讲述一个使用Python计算攒青豆数量的实现思路以及具体代码,如有更好的思路,大家可以分享在评论区。
问题描述
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析: 输入:height = [5,0,2,1,4,0,1,0,3] 输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
思路分析
其实通过这个例子可以发现,柱子的高度是有一定顺序规律的,能攒青豆的区域都是凹形部分,也就是两边数字大,中间小,且从坐到右相隔几个是从大到小排列的,如5,4,3,5和4中间夹着一块凹形攒豆区域,4和3之间夹着一块攒豆区域。
其实从列表[5,0,2,1,4,0,1,0,3]也能看出这个规律,因此我们可以通过循环数字列表,从第二个数开始,依次往后比较,如果后面存在有大于当前数字的数,则切换下一个数继续比较,直到后面找不到比当前数大的,就可以从当前索引往前到头索引之间形成一个凹形区域
就比如这个例子[5,0,2,1,4,0,1,0,3],从0开始,发现下一个数2就比它大,外层循环切换到下一个数2,将2和其后面的数比较,发现存在比2大的数4,以此类推...到4为止,后面就没有比4大的数了,所有5~4之间就组成一个凹形,接着我们可以比较头和4哪个大,将较小的数与它们之间每个数相减得出这部分攒的青豆。我们将4的下标设置为新的头,继续前面的操作,最后得出攒青豆总和。
代码实现
总结
只是简单的实现了题目要求的功能,可以计算n个随机排列的柱子攒青豆的数量,有兴趣的朋友们可以将代码优化一下。