[青训营×码上掘金]主题4 - 攒青豆

72 阅读2分钟

当青训营遇上码上掘金

主题:攒青豆

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

攒青豆.png

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

灵感与思路

通过思考题目和参考图中内容,不难看出所攒青豆数量与两侧柱子的高度相关,每个小凹槽的青豆数量都与最小高度的柱子相关,最终凹槽的青豆数量取决于填满小凹槽和大凹槽的数量和!

  • 思路一:可以通过考虑数组遍历的方式来完成计算青豆数量
  • 思路二:通过二分法来计算青豆数量
  • 思路三:通过双指针方法计算青豆数量

代码

本次代码实现部分采用较为简单的方式计算青豆结果,将数组二分并分别计算总青豆数量,采用数组遍历的方式,代码如下:

public class Main {
   public static void main(String []args) {
     //静态初始化
      int[] systemIn = {5,0,2,1,4,0,1,0,3};
      int count = countNumber(systemIn);
      System.out.println(count);
   }
​
   public static int countNumber(int[] array){
     int sum = 0;
     int len = array.length-1;
     int len1 = len/2;
     int[] count = new int[len];
     for (int i = 1; i < len1; i++){
         count[i-1] = array[len1] - array[i];
         sum += count[i-1];
     }
     for (int j = len1+1; j < len; j++){
         count[j-1] = array[len] - array[j];
         sum += count[j-1];
     }
     return sum;
   }
}

运行结果如下:

思考:对于这道题目有着更为简单,复杂度更低的方法!