收集小青豆
动态规划方法:
i个位置能收集到的小青豆取决于i两边比i高度高的最小值hmin,能够收集的小青豆个数为hmin - nums[i]
本题采用动规的方法,可以保证用很短的时间来预处理出每个位置两边的最大高度。首先去正向遍历一下数组,得到为leftMax的每个元素,然后去反向遍历数组,得到rightMax的每个元素。遍历之后可以发现leftMax的第一个元素就是nums的第一个元素,rightMax的第一个元素就是nums的最后一个元素。剩余元素的计算就可以推算是leftMax[i-1]和nums[i]中的较小值。最终根据leftMax[i]和rightMax[i]中的较小值和nums[i]做差累计,即为收集的小青豆的数量。
单调栈方法:
从栈头(元素从栈头弹出)到栈底的顺序应该是从小到大的顺序。因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹坑了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。
1.首先对更低的柱子进行入栈,如果后面出现高的柱子,就可以接到青豆。如果高度相同,则收集青豆为0
2.当出现高于栈顶的柱子是,结算前面的柱子,再计算青豆总数。
注:
保持栈元素顺序是从小到大