当青训营遇上码上掘金-攒青豆

38 阅读2分钟

当青训营遇上码上掘金--主题4 攒青豆。 本次趁寒假参加了字节青训营,打算充实一下自己,学习一些知识。营里大佬们很多,大家都很积极努力!!话不多说,我们先来看看这道攒青豆的题目吧!

题目

  • 主题 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 个单位的青豆。

解题思路: 我的思路是按列去求,能接到多少青豆只需要看左边最高的墙和右边最高的墙,而根据木桶原理,取其中最矮的一列就是所形成的凹槽的高度,然后遍历两堵墙之间的数组计算有多少未被占满的空间,便可得出所围成的凹槽能接到多少青豆。而左右两侧的柱子只能当边,所以我们只需遍历下标从 1 到 length - 2

代码实现

/**
* 支持 import Java 标准库 (JDK 1.8)
*/
import java.util.*;

/**
* 注意:目前 Java 代码的入口类名称必须为 Main(大小写敏感)
*/
public class Main {
   public static void main(String []args) {
      System.out.println(trap(new int[]{5,0,2,1,4,0,1,0,3}));
   }

   public static int trap(int[] height) {
    int sum = 0;
     
    for (int i = 1; i < height.length - 1; i++) {
        int maxLeft = 0;
         
        for (int j = i - 1; j >= 0; j--) {
            if (height[j] > maxLeft) {
                maxLeft = height[j];
            }
        }
        int maxRight = 0;
         
        for (int j = i + 1; j < height.length; j++) {
            if (height[j] > maxRight) {
                maxRight = height[j];
            }
        }
         
        int min = Math.min(maxLeft, maxRight);
        
        if (min > height[i]) {
            sum = sum + (min - height[i]);
        }
    }
    return sum;
}
}