大概题意:给定一个包含非负整数的数组,代表一条路上的每个位置的海拔高度,求在下雨后能够储存的最大的水量。一个样例如图所示:
我的具体做法是使用两个数组f 和 g。其中f[i] 表示位置i不会从左边漏出的最高水位,g[i]表示位置i不会从右边漏出的最高水位,则g[i] 和 f[i] 之间的最小值,就是位置i 的最高水位,用最高水位减去该位置的海拔高度,即是该位置储存的最大水量。而我们要怎么求每个位置i的f[i] 和 g[i] 呢?很简单,f[i] 是位置i 左边的位置的最大的海拔高度,位置i的水不会向左边漏出,因为位置i 与 左边最大海拔高度之间的位置在总体水量最大的情况下,肯定是已经填满水的了。相似的,g[i] 是位置i 右边的位置的最大的海拔高度。
而计算f[i] 和 g[i] 的过程也很简单,分别从左往右和从右往左扫描一遍即可。设数组的大小为n,则时间复杂度为O(n),因为计算总体最大水量也只要将每个位置的最大水量求和就可以了。具体代码如下:
const int maxn = 1000000 + 50 ;
int g[maxn], f[maxn] ;
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size() ;
memset(f, 0, sizeof(f)) ;
memset(g, 0, sizeof(g)) ;
int h ;
int fx = 0, gx = 0;
for (int i=0; i<n; i++) {
h = height[i] ;
fx = max(fx, h) ;
f[i] = fx ;
}
for (int i=n-1; i>=0; i--) {
h = height[i] ;
gx = max(gx, h) ;
g[i] = gx ;
}
int ans = 0 ;
for (int i=0; i<n; i++) {
ans += min(f[i], g[i]) - height[i] ;
}
return ans ;
}
};