当青训营遇上码上掘金

44 阅读1分钟

主题 4:攒青豆

4da83988076f407baef9847709eec3a2_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp 非常高兴能参加本次青训营码上掘金活动 我选择的是主题4攒青豆任务

题目要求

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

725ef710a59944d49d0315bece7a1ac1_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.webp

样例

输入:height = [5,0,2,1,4,0,1,0,3] 输出:17 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。

思路

我们求出每个位置能存储的青豆数量,最后加到一起就可以得到答案。 那么如何求解每个位置可以存放的青豆数量呢?我们可以预先处理处两个数组left_maxright_maxleft_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)。

谢谢观看