42. Trapping Rain Water
categories: [LeetCode]
tags: [array, two poiners, easy]
42. Trapping Rain Water
题目大意:
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
解题思路:
这道题我们可以用双指针一次遍历去做,我们分别用left和right代表数组两端
同时初始化三个自变量ans,leftmax 和rightmax代表最后答案,左边最大蓄水量,右边最大蓄水量
然后开始用while loop循环,条件是left < right
如果当前left柱子的高度小于right柱子的高度,
我们需要继续判断如果当前left柱子高度大于等于
当前左边最大蓄水量leftmax,我们需要更新一下leftmax使其等于当前left柱子的高度
否则则说明当前left柱子高度下于leftmax,则当前需水量ans += leftmax - left柱子的高度
无论left高度和leftmax比较如何,我们都需要将left指针挪到下一个left++
如果当前left的高度大于等于right的高度,我们则需要更新rightmax和看看right这边有没有可以蓄水的
同样的,如果right高度大于等于rightmax,rightmax 更新为right高度
否则说明当前right高度小于rightmax, 可以蓄水,蓄水量为ans += rightmax - right高度
无论right高度和rightmax比较如何,right指针都移到下一个right--
while loop结束,最后返回ans
注意: ans初始化要在while loop之前
注意:
None
复杂度:
Time Complexity:O(N)
Space Complexity: O(1)
Code示例:
class Solution {
public int trap(int[] height) {
int left = 0, right = height.length - 1;
int ans = 0;
int left_max = 0, right_max = 0;
while (left < right) {
if (height[left] < height[right]) {
if (height[left] >= left_max) {
left_max = height[left];
} else {
ans += (left_max - height[left]);
}
++left;
} else {
if (height[right] >= right_max) {
right_max = height[right];
} else {
ans += (right_max - height[right]);
}
--right;
}
}
return ans;
}
}