当青训营遇上码上掘金 这道题目中,给出了一组柱子高度,并且不考虑边角堆积,如果按照题目中给出的高度分布情况进行模拟,求出柱子能接住多少青豆。
首先我们可以想到暴力算法,即对于每个柱子,求出他左边和右边最高的柱子高度,然后计算出他能接住的青豆数量。这种算法时间复杂度为O(n^2),效率较低
后来通过查询相关知识可以想到使用双指针法,即从左右两边同时进行遍历,维护一个 leftMax 和 rightMax 变量,分别表示左边和右边最大的柱子高度。在遍历过程中,如果当前柱子高度小于左右两边最大柱子高度,则可以累加结果。这种方法的时间复杂度为O(n),效率较高
主要难点在于如何确定哪些位置可以累加结果。我们可以通过维护左右两边最大柱子高度来确定。
- 如果当前柱子高度小于左边最大柱子高度,则可以累加结果。
- 如果当前柱子高度小于右边最大柱子高度,则可以累加结果。
这样做的原因是,如果当前柱子高度大于等于左边最大柱子高度或者右边最大柱子高度,则该柱子不会成为结果,因为它会影响到其他柱子的结果贡献。
总结:使用双指针法可以在 O(n) 的时间复杂度内解决这道题目,而暴力算法的时间复杂度为 O(n^2),效率较低。