您的位置:首页 > 职场人生

O(n)时间解决的面试题:下雨积水量问题

2015-05-23 11:09 369 查看
问题描述

 
 

如下图所示,给定一个数组[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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: