主题 4:攒青豆 青训营笔记

134 阅读1分钟

当青训营遇上码上掘金

题目:主题 4:攒青豆

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

image.png

以下为上图例子的解析:

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

思路:

求青豆个数的题目,可以使用暴力枚举的思想,对于每一列的柱子,向左和向右扩展,直到遇到比它高的柱子,计算出这个矩形的面积。

但是这种暴力枚举的方式时间复杂度是 O(n^2),时间效率较低。

可以使用优化的思想,在枚举每一列的柱子的时候,维护每一列向左和向右的最大值,从而提高算法效率。

利用这种方式实现的代码时间复杂度是 O(n),时间效率较高。

接下来看看实现的代码

class Solution {
    public int trap(int[] height) {
        int res = 0;
        int[] maxLeft = new int[height.length];
        int[] maxRight = new int[height.length];
        for (int i = 1; i < height.length; i++) {
            maxLeft[i] = Math.max(maxLeft[i - 1], height[i - 1]);
        }
        for (int i = height.length - 2; i >= 0; i--) {
            maxRight[i] = Math.max(maxRight[i + 1], height[i + 1]);
        }
        for (int i = 0; i < height.length; i++) {
            res += Math.min(maxLeft[i], maxRight[i]) - height[i];
        }
        return res;
    }
}
​

可以看到通过这种方式实现的代码时间复杂度是 O(n),比起暴力破解的方式时间复杂度O(n^2),提高了时间复杂度。

具体代码测试完整的实例可以通过马上掘金看到,见链接code.juejin.cn/pen/7199126…

这次题目看似是在求青豆数量,实则可以转化为求矩形面积