描述
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的区域高度视为0)
数据范围:
0
≤
n
≤
1
0
6
0 \le n \le 10^6
0≤n≤106 ,数组中每个值满足
0
<
v
a
l
≤
1
0
9
0 < val \le 10^9
0<val≤109
要求:空间复杂度 O(1),时间复杂度 O(n)
示例1
输入:[3,1,2,5,2,4]
返回值:5
说明:数组 [3,1,2,5,2,4] 表示柱子高度图,在这种情况下,可以接 5个单位的雨水,蓝色的为雨水 ,如题面图。
示例2
输入:[4,5,1,3,2]
返回值:2
代码
class Solution {
public:
/**
* max water
* @param arr int整型vector the array
* @return long长整型
*/
long long maxWater(vector<int>& arr) {
// write code here
int i=0,j=arr.size()-1;
long long sum=0,m;
while(i<j){
if(arr[i]<arr[j]){
for(m=i+1;arr[m]<arr[i];m++){
sum+=arr[i]-arr[m];
}
i=m;
}else{
for(m=j-1;arr[m]<arr[j];m--){
sum+=arr[j]-arr[m];
}
j=m;
}
}
return sum;
}
};