「青训营 X 码上掘金」主题创作 | 主题4:攒青豆

60 阅读1分钟

当青训营遇上码上掘金

前言

相信很多人看到主题4这道题都挺熟悉的,看得出就是力扣里接雨水的翻版,在略微浏览了四个主题之后,我选择了主题4

题目

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

攒青豆.png

题解

本题有三种比较普遍的解决方法,分别是1.动态规划,2.双指针,3.单调栈。 这里我用了动态规划这个我比较熟悉的方法。想法如下:

先遍历一遍求出每个单元格右边最高柱子和左边的最高柱子,然后用right_h,left_h两个数组分别存储。状态转移方程如下:

left_h[i] = max(left_h[i-1],height[i]); right_h[j] = max(right_h[j+1],height[j])

每个单元格所能存储豆子数量取决于左最高柱和右最高柱的小者,等于:

height[i] - min(left_h[i],right_h[i])

然后对于求总豆子数等于求每个单元格存储豆子数相加,如下:

ans += height[i] - min(left_h[i],right_h[i])

代码

在Script板块中由C++实现