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;

}

}

posted @ 2015-05-23 11:09  keedor  阅读(543)  评论(0编辑  收藏  举报