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

43 阅读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 个单位的青豆。

思路

解题思路和leetcode 42. 接雨水相同

  • 首先找到柱子的最大高度
  • 然后以柱子最大高度按计算 举例 以第一行开始 比1小的都是凹槽并且两边有高度大于等于1 可以装下青豆
  • 所以如果求的高度为i,用变量temp,保存当前存储的青豆,遇到高度>=i 的时候,开始更新 temp。更新原则是遇到高度<i 的就把temp加 1,遇到高度>=i的,就把temp加到最终的答案ans里,并且temp=0,然后继续循环。

代码

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

/**
* 注意:目前 Java 代码的入口类名称必须为 Main(大小写敏感)
*/
public class Main {
   public static void main(String []args) {
      Scanner in=new Scanner(System.in);
      int[] height = Arrays.stream(in.nextLine().split(" ")).mapToInt(Integer::valueOf).toArray();
      getRe(height);
   }
  
  public static int getRe(int[] height){
    int max=0;
    for(int i=0;i<height.length;i++){
      if(height[i]>max){
        max=height[i];
      }
    }
    int ans=0;
    for(int i=1;i<=max;i++){
      boolean isStart=false;
      int temp_sum=0;
      for(int j=0;j<height.length;j++){
        if(isStart&&height[j]<i){
          temp_sum++;
        }
        if(height[j]>i){
          ans+=temp_sum;
          temp_sum=0;
          isStart=true;
        }
      }
    }
    return ans;
  }
}