LeetCode——42. 接雨水(双指针)

332 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

题目描述

image.png

解题思路

接雨水是典型的双指针问题,首先定义一个左指针和一个右指针。

  1. 初始化
    • 左指针指向第一个元素
    • 右指针指向最后一个元素
  2. 定义一个最终要返回的和sum=0.
  3. 定义两个变量分别用来存储左边的最大值和右边的最大值。
  4. 循环条件是左指针小于右指针。
  5. 每次进入循环都更新左指针和右指针指过轨迹的最大值。
  6. 如果左指针最大值小于右指针最大值,可以接的雨水就是左指针的最大值减去当前位置的高度,然后左指针向右移动。
  7. 如果左指针最大值大于等于右指针最大值,计算右指针最大值减去当前右指针高度,然后让右指针左移动。

为了更加方便大家对这个题目的理解,我们可以向下面这张图一样,依次画出左右指针和最大值的变化,最后返回最大值。

image.png

AC代码

var trap = function(height) {
  let [left, right] = [0, height.length - 1];
  let [leftMax, rightMax] = [0, 0];
  let sum = 0;

  while (left < right) {
    leftMax = Math.max(leftMax, height[left]);
    rightMax = Math.max(rightMax, height[right]);

    if (leftMax < rightMax) {
      sum += leftMax - height[left++];
    } else {
      sum += rightMax - height[right--];
    }
  }
  return sum;
};

思考

接雨水是脉脉上经常被调侃的一道题目,当然了这个题目也经常出现在牛客等面试题中,因此我们一定要搞懂这道题,双指针问题是面试常考的一类问题,解决这类题目最重要的就是想清楚左指针和右指针在什么时候移动,左指针最大值和右指针最大值的含义是什么。