当青训营遇上码上掘金 题目:现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
- 这道题可以使用几种不同的方式解决,本文介绍如何使用双指针来解决本题,时间复杂度为O(N),额外空间复杂度为O(1)。
- 思想主要为先计算每一列可以存储的青豆数,然后将总和加在一起得出问题答案。
- 很明显,其中某列存储的青豆数量取决于这一列左侧的柱子的最大高度和右侧柱子的最大高度中的最小高度。
- 双指针的解题思路就是从最左侧柱子和最右侧柱子开始遍历,如果左边的最大值更小就从左边开始遍历,如果右边的最大值更小就从右边开始遍历。
- 最左侧与最右侧一定为柱子,也就是不可能存储青豆。
以本题为例:
- 左指针为5,右指针为3,5>3,第8列柱子高度0,青豆数量3-0=3,右指针移动,右指针为3。
- 左指针为5,右指针为3,5>3,第7列柱子高度1,青豆数量3-1=2,右指针移动,右指针为3。
- 左指针为5,右指针为3,5>3,第6列柱子高度0,青豆数量3-0=3,右指针移动,右指针为4。
- 左指针为5,右指针为4,5>4,第5列柱子高度4,青豆数量4-4=0,右指针移动,右指针为4。
- 左指针为5,右指针为4,5>4,第4列柱子高度1,青豆数量4-1=3,右指针移动,右指针为4。
- 左指针为5,右指针为4,5>4,第3列柱子高度2,青豆数量4-2=2,右指针移动,右指针为4。
- 左指针为5,右指针为4,5>4,第2列柱子高度0,青豆数量4-0=4,右指针移动,双指针相遇,结束。将每列青豆数量相加3+2+3+0+3+2+4=17。
使用go语言实现: