当青训营遇上码上掘金
题目如下:现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
参考样例
输入: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;
}
}