当青训营遇上码上掘金
这道题和接雨水的题的思路很相似,本题有很多种解法
解法一:利用单调栈的思想
关于一维数组的各类题目中,可以不需要对一个数组来回的遍历,也不需使用动态规划方程,这就是单调栈。顾名思义,单调栈是一个栈,需要题目符合先进后出的方式,同时它是单调的,也就是栈里面的元素要么递增,要么递减,一般是边入栈边处理,遇到不单调的情况便进行处理。总之,在我们读取元素是从左到右的,而处理元素是从右到左的,就可以考虑单调栈的思想了。 本题可以先遍历到当前柱子,把栈顶元素设置为top,下一个元素为next,所以有h[top]<=height[next]。假如h[i]>h[top],证明当前凹槽区域可以用来存放青豆,存放青豆的宽度为i-next-1,高度为h[next]与height[i]的较小值和栈顶h[top]的差值,最后将凹槽中存放的青豆的大小累加即可得到最终结果。
解法二:利用双指针的思想
可以利用两个指针分别从左右两边向中间走,得到每一个横坐标上可以放置的青豆数量并进行累加,从而得到所有的青豆数量。
解法三:利用动态规划的思想 首先从前往后遍历数组,如果当前高度高于上一个柱子高度,证明当前柱子的加入,可以继续加入豆子,导致最优解发生了变化,所以要更新前面柱子的高度,这时候,要再一次进行遍历;寻找前面比当前柱子高的的柱子,找到后,更新寻找过程中遇到的柱子的高度较矮的柱子。如果一直找到了初始位置,也没有找到,则说明当前柱子是前面所有柱子中最高的的。这时候说明当前填充高度,为最高的柱子,取开始和当前位置的较低点。如果当前高度低于两边的高度,那么当前填充高度为左、右两个柱子中较短的高度。