当青训营遇上码上掘金
介绍青训营 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;
贴上验证类:(由于输入格式化问题采用了一点会被认为不安全的方法
最后,青豆能变现么?(好一个激励机制