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

题目描述

image.png

解题思路

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

  1. 初始化

    • 左指针指向第一个元素
    • 右指针指向最后一个元素
  2. 定义一个最终要返回的和sum=0.

  3. 定义两个变量分别用来存储左边的最大值和右边的最大值。

  4. 循环条件是左指针小于右指针。

  5. 每次进入循环都更新左指针和右指针指过轨迹的最大值。

  6. 如果左指针最大值小于右指针最大值,可以接的雨水就是左指针的最大值减去当前位置的高度,然后左指针向右移动。

  7. 如果左指针最大值大于等于右指针最大值,计算右指针最大值减去当前右指针高度,然后让右指针左移动。

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

image.png

扫描二维码关注公众号,回复: 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;
};

思考

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

猜你喜欢

转载自blog.csdn.net/sinat_41696687/article/details/125197756