【Java】攒青豆(力扣接雨点)

88 阅读1分钟

当青训营遇上码上掘金

介绍青训营 X 码上掘金活动第四题的解法。

原题目:  现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)

其实就是个接雨点问题(下面介绍主要方法)

将各个柱子的高度提取到数组

首先初始化,并对柱子情况是否能攒青豆进行判断:

nt result = 0;
if(arr.length <= 1) {
    return result;
}

分别设置数组的左右指针位置left和right,分别确定左右两侧可以开始作为容器壁的柱子:

int left = 0;
while(left < arr.length - 1 && arr[left + 1] >= arr[left]) {
    left++;
}
int right = arr.length - 1;
while(right >= 1 && arr[right - 1] >= arr[right]) {
    right--;
}

左右两侧指针位置开始向中间逼近,具体情况为:从指针位置向另一次逼近,路途中逐渐累积豆子,当遇到比当前指针位置代表柱子高的柱子时,将其位置设置为新的指针,知道左右指针相遇。见下方代码:

while(left < right) {
    int leftHeight = arr[left];
    int rightHeight = arr[right];
    if(leftHeight <= rightHeight) {
        while(left < right) {
            left++;
            if(arr[left] < leftHeight) {
                result += leftHeight - arr[left];
            }
            else {
                break;
            }
        }
    }
    else {
        while(left < right) {
            right--;
            if(arr[right] < rightHeight) {
                result += rightHeight - arr[right];
            }
            else {
                break;
            }
        }
    }
}

最后返回代码中的result即可

return result;

贴上验证类:(由于输入格式化问题采用了一点会被认为不安全的方法

最后,青豆能变现么?(好一个激励机制