题目描述
解题思路
接雨水是典型的双指针问题,首先定义一个左指针和一个右指针。
-
初始化
- 左指针指向第一个元素
- 右指针指向最后一个元素
-
定义一个最终要返回的和sum=0.
-
定义两个变量分别用来存储左边的最大值和右边的最大值。
-
循环条件是左指针小于右指针。
-
每次进入循环都更新左指针和右指针指过轨迹的最大值。
-
如果左指针最大值小于右指针最大值,可以接的雨水就是左指针的最大值减去当前位置的高度,然后左指针向右移动。
-
如果左指针最大值大于等于右指针最大值,计算右指针最大值减去当前右指针高度,然后让右指针左移动。
为了更加方便大家对这个题目的理解,我们可以向下面这张图一样,依次画出左右指针和最大值的变化,最后返回最大值。
扫描二维码关注公众号,回复:
14646820 查看本文章
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;
};
思考
接雨水是脉脉上经常被调侃的一道题目,当然了这个题目也经常出现在牛客等面试题中,因此我们一定要搞懂这道题,双指针问题是面试常考的一类问题,解决这类题目最重要的就是想清楚左指针和右指针在什么时候移动,左指针最大值和右指针最大值的含义是什么。