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

223 阅读1分钟

当青训营遇上码上掘金

题目

现有 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 个单位的青豆。

思路

这题是力扣的经典题“接雨水”,只是把雨水换成了青豆。

这里用了一点取巧的思路:左右高度的较小者,减去当前块高,就是可装水量

代码

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

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

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