当青训营遇上码上掘金之主题四双指针
-
主题 4:攒青豆
现有 n 个宽度为 1 的柱子,给出 n 个非负整数依次表示柱子的高度,排列后如下图所示,此时均匀从上空向下撒青豆,计算按此排列的柱子能接住多少青豆。(不考虑边角堆积)
大致思路:通过左右两个指针比较,分别记录可攒青豆数量,并累加得出最后结果
- 记录左右两个指针,分别初始化0和数组长度-1
- 定义左右指针对应高度最大值,均初始化为0
- 定义结果变量,初始化为0
- 进入while循环,直到左右指针相等结束
- 循环内部,通过比较左右指针对应高度,以矮的一侧为主,用当前高度与最大高度比较,更新最大高度和累加结果,最后得出结果
java完整代码:
class Solution{
public int res(int[] height){
// 初始化 左右指针
int left = 0,right = height.length-1;
// 初始化 左右最大高度
int l_max = 0,r_max = 0;
// 初始化 结果
int ans = 0;
// 当左指针大于右指针退出循环
while(left<right){
// 若左边指针数值小于右边,以左边高度为主
if(height[left]<height[right]){
// 若当前左指针数值大于等于左最大高度,更新最大高度
if(height[left]>=l_max){
l_max = height[left];
}
// 否则,累加可攒青豆数,[最大高度-当前高度]
else{
ans += l_max - height[left];
}
// 向右移动
left++;
}
// 左大于等于右 一样的逻辑
else{
if(height[right]>=r_max){
r_max = height[right];
}else{
ans += r_max-height[right];
}
right--;
}
}
return ans;
}
码上掘金 码上掘金