返回

一览众山小!前端算法题专项系列【80】

前端

前言

欢迎来到前端算法必刷题系列的第80篇文章!今天,我们将一起学习一道经典的算法题——接雨水(Trapping Rain Water)。这道题考验的是你的动态规划和空间优化能力,同时也是面试官们非常喜欢考察的一道题。

题目

给你一个非负整数数组 height ,表示一片垂直立柱的高度,其中第 i 个立柱的高度为 height[i]

雨水可以收集在两个相邻的立柱之间,并且每个立柱只能收集到比它矮的立柱之间收集到的雨水。

求出最多能收集多少雨水。

解题思路

这道题可以使用双指针算法来解决。我们从数组的两端开始,分别设置两个指针leftright,然后向中间移动。

  1. 如果left指向的立柱高度小于right指向的立柱高度,则在left指向的立柱处可以收集到雨水。我们计算出left指向的立柱处可以收集的雨水量,然后将left指针向右移动一位。

  2. 如果right指向的立柱高度小于left指向的立柱高度,则在right指向的立柱处可以收集到雨水。我们计算出right指向的立柱处可以收集的雨水量,然后将right指针向左移动一位。

  3. 重复以上步骤,直到leftright指针相遇。

代码实现

/**
 * 接雨水
 *
 * @param {number[]} height
 * @return {number}
 */
const trap = (height) => {
  if (height === null || height.length === 0) {
    return 0;
  }

  let left = 0;
  let right = height.length - 1;
  let leftMax = height[left];
  let rightMax = height[right];
  let result = 0;

  while (left < right) {
    if (leftMax < rightMax) {
      left++;
      leftMax = Math.max(leftMax, height[left]);
      result += leftMax - height[left];
    } else {
      right--;
      rightMax = Math.max(rightMax, height[right]);
      result += rightMax - height[right];
    }
  }

  return result;
};

时间复杂度

双指针算法的时间复杂度为O(n),其中n是数组height的长度。

空间复杂度

双指针算法的空间复杂度为O(1)

结语

以上就是前端算法必刷题系列的第80篇,希望对你有帮助!如果你有任何问题或建议,欢迎在评论区留言。我们下期再见!