当青训营遇上码上掘金

109 阅读2分钟

当青训营遇上码上掘金

主题四 __ 攒青豆 __ 创作

攒青豆这个主题,是一道非常经典的算法题——接雨水。应该也是开发人员都见过,或者练习过的题目。 其中双指针法是相对容易理解其思想的解法。 但是还有

1、暴力   时间O(N^2)  空间O(1)
很明显每个柱子顶部可以储水的高度为:该柱子的左右两侧最大高度的较小者减去此柱子的高度。因此我们只需要遍历每个柱子,累加每个柱子可以储水的高度即可。

2、动态规划 时间O(N) 空间O(N)
在上述的暴力法中,对于每个柱子,我们都需要从两头重新遍历一遍求出左右两侧的最大高度,这里是有很多重复计算的,很明显最大高度是可以记忆化的,可以用数组边递推边存储,也就是常说的动态规划,DP。

3、单调栈 时间O(N) 空间O(N)
因为本题是一道典型的单调栈的应用题.
简单来说就是当前柱子如果小于等于栈顶元素,说明形不成凹槽,则将当前柱子入栈;反之若当前柱子大于栈顶元素,说明形成了凹槽,于是将栈中小于当前柱子的元素pop出来,将凹槽的大小累加到结果中。
单调栈就是比普通的栈多一个性质,即维护栈内元素单调。
比如当前某个单调递减的栈的元素从栈底到栈顶分别是:[10, 9, 8, 3, 2],如果要入栈元素5,需要把栈顶元素pop出去,直到满足单调递减为止,即先变成[10, 9, 8],再入栈5,就是[10, 9, 8, 5]。

这是所了解的攒青豆(接雨水)的所练习过的全部解法。