码上掘金

180 阅读2分钟

当青训营遇上码上掘金

题目四 攒青豆

 由于每个柱子的宽度为1所以面体为该列的高度,我们只需要求出除第一列和最后一列之外其余列每列青豆的数量,最后相加即可。为什么要去除第一列和最后一列?因为第一列无法存储青豆左边没有东西遮挡,最后一列同理。让指针在第二列开始向后遍历,想要求出当前列能存储的青豆数量需要四步,1、寻找出当前列左边列高度的最大值2、寻找出当前列右边列高度的最大值3、求出二者中较小的那个柱子的高度,因为能存放多少豆子取决于最高的两个柱子中较矮的那个4、判断该列青豆高度与柱子高度的大小,是否叠加到结果集中。
 拿主页给出的条件来举个例子,下标为0和4的两个柱子,他们的高度为5和4并且中间没有比他们高的柱子了,所以他们中间每列的青豆高度都为4,我们按照这个思路找出每个列位于哪两个最高的柱子之间,计算当前列的实际青豆数量,最后加到结果集中即可,在找到当前列的青豆高度时还需要确定青豆的实际高度才能加入结果集,例如下标为2的那列,它的青豆高度为四,由于青豆高度大于当前列的柱子高度所以要减去柱子高度获得实际青豆高度在将结果加入结果集,反观下标为4的那列,他的青豆高度为4而柱子高度也为4所以实际高度为0不需要加入结果集。具体的java实现代码如下:

public int Qingdou(int[] bean){
    int len=bean.length;
    int res=0;
    for (int i = 1; i <len-1 ; i++) {
        int lmax=bean[0];
        int rmax=bean[len-1];
        for (int j = i; j >=0; j--) {
            lmax=Math.max(bean[j],lmax);
        }
        for (int j =i ; j <len ; j++) {
            rmax=Math.max(bean[j],rmax );
        }
        int min=Math.min(rmax,lmax);
        if (min>bean[i]){
            res+=min-bean[i];
        }
    }


    return res;
}