当青训营遇上码上掘金
前言
相信很多人看到主题4这道题都挺熟悉的,看得出就是力扣里接雨水的翻版,在略微浏览了四个主题之后,我选择了主题4
题目
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
题解
本题有三种比较普遍的解决方法,分别是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++实现