题目描述

LeetCode——42. 接雨水(双指针)_初始化

解题思路

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

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

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

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

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;
};

思考

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