Dados n inteiros não negativos que representam um mapa de elevação onde a largura de cada barra é 1, calcule quanta água ela é capaz de reter após a chuva.
Por exemplo,
Dado [0,1,0,2,1,0,1,3,2,1,2,1], retorna 6.
这道题 来源于leetcode, 据说 是 一道 Google 的 面 试题 , 这儿 给出 一种 比较 简单 的 解法 : 先 计算 柱状图 的 凸 包 面积 , 然后 减去 柱状图 本身 的 面积 , 就是 所能 存储 水 的. 。 时间 复杂 度 : O (n) , 空间 复杂 度 : O (1)。
class Solution {
//O(n) algorithm
public:
int trap(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(n<=2)
return 0;
int sum=A[0],mi=0;
for(int i=1;i<n;i++)
{
sum+=A[i];
if(A[i]>A[mi])
mi=i;
}
int left=0,right=0,min=0;
for(int i=1;i<=mi;i++)
if(A[i]>=A[min])
{
left+=A[min]*(i-min);
min=i;
}
min=n-1;
for(int j=n-2;j>=mi;j--)
if(A[j]>=A[min])
{
right+=A[min]*(min-j);
min=j;
}
return left+right+A[mi]-sum;
}
};