1月13日,青训营x码上掘金活动主题四:攒青豆
程序使用java实现,源码为:
* 支持 import Java 标准库 (JDK 1.8)
*/
import java.util.*;
/**
* 注意:目前 Java 代码的入口类名称必须为 Main(大小写敏感)
*/
public class Main {
public static int countGreenBean(int[] height) {
Arrays.sort(height);
int count = 0;
int countBean = 0;
while (height[count] == 0) {
count++;
}
countBean += (height[count] - height[0]) * count;
int sum = height[height.length - 1] * (height.length - count);
for (int i = count; i < height.length; i++) {
sum -= height[i];
}
countBean += sum;
return countBean;
}
public static void main(String[] args) {
int[] height = {5, 0, 2, 1, 4, 0, 1, 0, 3};
System.out.println(countGreenBean(height));
}
}
总的能装的青豆数应该等于有效柱(即不为0的柱)的个数乘以最高柱然后减去每个有效柱高度(因为单位青豆为1,柱子宽度也为1)再加上等于0的柱子个数与最小有效柱的差的差再乘以高度等于0的柱子。
有了这个思路后,就可以着手程序的编写,首先先对height数组进行升序排序,然后通过while循环计算出柱子高度为0的的个数,并记下索引,条件使用height[count] == 0进行判断,循环体使用count++计算位置索引,当条件不满足退出循环时,通过height数组长度减去索引位置乘以最高柱子长度(height[height.lenght-1],因为通过升序排序后最高柱子处于数组末尾),计算出有效柱子的总的块数空间sum,接下来通过记录下为0的总共的数量即结束索引,乘以最小柱子减去0柱,就可以得到高度为0的柱子能落下的总的青豆数,并赋值给countBean;之后通过for循环,从记录下的索引开始,用sum减去没一个有效柱子高度,最后得到落在有效柱子上的青豆数目,然后把加上之前的0柱得到的青豆数并返回,即可得到总的青豆数。
该题思路并不算难,只是需要思维的转换,即计算每层的柱子与其相邻柱子的高度差来填补青豆,但要注意相等柱子个数已其不等的相邻柱子高度差的坑,最后分为两部分青豆数目相加返回即可,要注意由于没有足够多的测试数据,本算法可能错误,或步骤还需优化,仅仅供参考,并不能作为答案。