当青训营遇上码上掘金之主题四双指针

175 阅读1分钟

当青训营遇上码上掘金之主题四双指针

  • 主题 4:攒青豆

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

攒青豆.png

大致思路:通过左右两个指针比较,分别记录可攒青豆数量,并累加得出最后结果

  • 记录左右两个指针,分别初始化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;
}

码上掘金 码上掘金