当青训营遇上码上掘金
主题:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
以下为上图例子的解析:
输入: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;
}
}
运行结果如下:
思考:对于这道题目有着更为简单,复杂度更低的方法!