题解 | #接雨水问题#
接雨水问题
http://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f
// 两次遍历:从左向右得到动态最大值;从右到左得到动态最大值 long long maxWater(int* arr, int arrLen ) { // write code here long long res=0; int i=0; int max=0; int a[arrLen]; a[0]=arr[0]; int b[arrLen]; b[arrLen-1]=arr[arrLen-1]; for(i=0;i<arrLen;i++) // 从左向右遍历 { max=fmax(max,arr[i]); a[i]=max; } max=0; // 重置最大值 for(i=arrLen-1;i>-1;i--) // 从右向左 { max=fmax(max,arr[i]); b[i]=max; } for(i=0;i<arrLen;i++) { res+=(fmin(a[i],b[i])-arr[i]); // 取两次最大值的最小值与 arr 元素相减就是该元素位置接到的雨水,加入结果中 } return res; }