主题 4:攒青豆
非常高兴能参加本次青训营码上掘金活动 我选择的是主题4攒青豆任务
题目要求
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
样例
输入:height = [5,0,2,1,4,0,1,0,3] 输出:17 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。
思路
我们求出每个位置能存储的青豆数量,最后加到一起就可以得到答案。
那么如何求解每个位置可以存放的青豆数量呢?我们可以预先处理处两个数组left_max和right_max。left_max[i]表示height[0]~height[i]中最高的柱子,right_max[i]表示height[i]~height[n-1]中最高的柱子。
JAVA代码
class Solution {
public int trap(int[] height) { int n = height.length; if (n == 0) return 0; int[] left_max = new int[n], right_max = new int[n]; left_max[0] = height[0]; for (int i = 1; i < n; i++) left_max[i] = Math.max(left_max[i - 1], height[i]); right_max[n - 1] = height[n - 1]; for (int i = n - 2; i >= 0; i--) right_max[i] = Math.max(right_max[i + 1], height[i]); int res = 0; for (int i = 0; i < n; i++) res += Math.min(left_max[i], right_max[i]) - height[i]; return res; }}
时空复杂度分析
时间复杂度:O ( n ) O(n)O(n)。 空间复杂度:O ( n ) O(n)O(n)。