O(n)时间解决的面试题:下雨积水量问题
问题描述
如下图所示,给定一个数组[0,1,0,2,1,0,1,3,2,1,2,1],对应每个轴上的高度,求能积水的水量
分析问题
每一块水域的高度等于它左边最大值和右边最大值中的最小值。
解决问题
class solution{
public:
int trap(vector<int> &A){
int n=A.size();
int result=0;
vector<int> left(n),right(n);
for(int i=0;i<n;i++){
//前缀的最大值
//left中存放从0~i的最大值,显然,最大值要么是A[i],要么和之前的一样
left[i]=i?max(left[i-1],A[i]):A[i];
}
//后缀的最大值
for(int i=n-1;i>=0;--i){
right[i]=i==n-1?A[i]:max(right[i-1],A[i]);
}
//对于第i块来说,它的值是前缀的最大值和后缀的最大值中最小的那个
for(int i=0;i<n;++i){
result+=min(left[i],right[i])-A[i];
}
return result;
}
}