返回
一览众山小!前端算法题专项系列【80】
前端
2023-10-31 23:18:35
前言
欢迎来到前端算法必刷题系列的第80篇文章!今天,我们将一起学习一道经典的算法题——接雨水(Trapping Rain Water)。这道题考验的是你的动态规划和空间优化能力,同时也是面试官们非常喜欢考察的一道题。
题目
给你一个非负整数数组 height
,表示一片垂直立柱的高度,其中第 i
个立柱的高度为 height[i]
。
雨水可以收集在两个相邻的立柱之间,并且每个立柱只能收集到比它矮的立柱之间收集到的雨水。
求出最多能收集多少雨水。
解题思路
这道题可以使用双指针算法来解决。我们从数组的两端开始,分别设置两个指针left
和right
,然后向中间移动。
-
如果
left
指向的立柱高度小于right
指向的立柱高度,则在left
指向的立柱处可以收集到雨水。我们计算出left
指向的立柱处可以收集的雨水量,然后将left
指针向右移动一位。 -
如果
right
指向的立柱高度小于left
指向的立柱高度,则在right
指向的立柱处可以收集到雨水。我们计算出right
指向的立柱处可以收集的雨水量,然后将right
指针向左移动一位。 -
重复以上步骤,直到
left
和right
指针相遇。
代码实现
/**
* 接雨水
*
* @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篇,希望对你有帮助!如果你有任何问题或建议,欢迎在评论区留言。我们下期再见!