当青训营遇上码上掘金-主题4-攒青豆

20 阅读1分钟

当青训营遇上码上掘金-主题4-攒青豆

参加码上掘金活动,前两题为前端,不会;第三题没看完,一眼就看到攒青豆,太贴切青训营活动了。

题目:攒青豆

现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积) image.png

思路:

题目理解:左右柱子中间凹槽的部分是能攒下来的,因此只需对比左右柱子的高度,找到最低的柱子再减去凹槽中可能有的柱子的高度,然后挨着累加

  • 双指针解法

  • 从两端向中间遍历:声明左右变量来动态记录左右两端最大值,定义左右指针,指向左右柱子的高度,左右同时向中间遍历,
  • 指针遍历时,如果左指针的值比右指针>,则在结果中累加上(右边最大值-当前右指针的值) 如left = 0,height(left) =5,right = len(height)-2,height(right)=0,rightMax = 3,此时就可以将其结果加起来,res += rightMax - height(right)
  • 直到左右指针碰到结束循环,累加出最终结果

完整代码

体会:不止有双指针的做法,但是个人对双指针算法比较熟悉,后续还应学习其他方法来解决问题。