当青训营遇上码上掘金
我选择的主题是:
主题 4:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
一、双指针解法:
使用两个指针分别从数组的两端开始遍历,并在遍历过程中存储左右两边的最大高度。 通过不断移动指针,累加左右两边高度之差并与当前柱子高度进行比较,最后返回累加值就是最大矩形面积。
最后返回累加值 res 就是最大青豆数量。
输入:height = [5,0,2,1,4,0,1,0,3]
输出:17
解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
第一种解法就是这样,但是突然发现字数不太够,所以临时想了第二种解法,下面就是第二种解法“动态规划解法”具体操作如下。
2.动态规划解法:
- left[i] = max(left[i-1], heights[i])
- right[i] = max(right[i+1], heights[i])
首先先声明 left 和 right 两个数组,分别表示当前柱子左边和右边的最大高度。再用循环将 left[0] 赋值为 height[0], 从 i=1开始,遍历每一个柱子,最终返回 res 就是最大青豆数量。
时间复杂度为 O(n), 空间复杂度为 O(n)。
谢谢大家