当青训营遇上码上掘金|主题 4:攒青豆

29 阅读1分钟

当青训营遇上码上掘金

  • 主题 4:攒青豆

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

CleanShot 2023-02-14 at 15.58.34@2x.png 以下为上图例子的解析: 输入:height = [5,0,2,1,4,0,1,0,3] 输出:17 解析:上面是由数组 [5,0,2,1,4,0,1,0,3] 表示的柱子高度,在这种情况下,可以接 17 个单位的青豆。 解题思路: 题目有几种方式可以来解决,暴力方法,双指针等方法 ,本题我采用的是双指针的方式来解决问题。 1.暴力法 对于每个柱子,都从左向右去寻找比它高的柱子。计算这两个柱子围城的区域可以承受的最大豆子数目。 2.双指针方法(java版本) 首先找到整个柱子数组中最高的柱子,然后把柱子分为左右两个部分。 使用left和right来标记左右最左面和最右面 的柱子。 比较left和right所指向的柱子的高度,把指针移动到比较短的柱子的右面,移动的过程中,累计青豆的数目 最终的结果就是累计到的青豆数量。同时在移动过程中,不要忘记left++和right--。 代码是由java编写。

CleanShot 2023-02-14 at 16.10.58@2x.png

 public static void main(String []args) {
     int[] heights = new int[]{5,0,2,1,4,0,1,0,3};
     int beanNum = 0;
     int left = 1,right = heights.length - 2;
     int leftMax = heights[0];
     int rightMax = heights[right + 1];
     while(left <= right){
       leftMax = Math.max(leftMax,heights[left]);
       rightMax = Math.max(rightMax,heights[right]);
       if(leftMax > rightMax){
         beanNum += rightMax - heights[right];
         right--;
       }else{
         beanNum += leftMax = heights[left];
         left++;
       }
     }
      System.out.println("青豆数"+beanNum);
   }
}