思路:
数组+技巧。时间复杂度O(N),空间复杂度O(1)。
找到最高的柱子的位置(可能不止一个,选任意一个都行),这样,将array分成左右两部分:
(1)遍历左部分,保存一个当前认为的最高的柱子的高度h,如果所经过的柱子高度 h' 比 h 小,那么,h-h' 一定是被trap住的;时刻更新当前认为的最高柱子。
(2)对于右半部分也是一样。
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
//find max height to split the array
int max = 0;
for(int i = 0; i < n; ++i) {
if(height[i] > height[max]) {
max = i;
}
}
//calculate sum from left to max
int sum = 0, peak = 0;
for(int i = 0; i < max; ++i) {
if(height[i] > peak) {
peak = height[i];
}else {
sum += peak - height[i];
}
}
peak = 0;
//calculate sum from right to max
for(int i = n - 1; i > max; --i) {
if(height[i] > peak) {
peak = height[i];
}else {
sum += peak - height[i];
}
}
return sum;
}
};
本文介绍了一种高效的雨水捕捉算法,通过一次遍历找到最高柱子,然后分别从左右两边计算可以捕捉到的雨水总量,实现时间复杂度为O(N),空间复杂度为O(1)。该算法适用于解决特定类型的数组问题。
300

被折叠的 条评论
为什么被折叠?



