题目描述:
给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个容器,请返回容器能装多少水。
解题分析:
使用两个数组,leftMaxVec存储当前值左边的最大值,rightMaxVec存储当前值右边的最大值,那么min(leftMaxVec[i], rightMaxVec[i])-arr[i]便是当前这一竖能存多少格水。
class Solution {
public:
/**
* max water
* @param arr int整型vector the array
* @return long长整型
*/
long long maxWater(vector<int>& arr) {
// write code here
if(arr.size()<=2)
return 0;
vector<int> leftMaxVec(arr.size());
vector<int> rightMaxVec(arr.size());
int maxHeight=0;
for(int i=0; i<arr.size(); ++i){
leftMaxVec[i]=max(maxHeight, arr[i]);
maxHeight=max(maxHeight, arr[i]);
}
maxHeight=0;
for(int i=arr.size()-1; i>=0; --i){
rightMaxVec[i]=max(maxHeight, arr[i]);
maxHeight=max(maxHeight, arr[i]);
}
long long ans=0;
for(int i=1; i<arr.size()-1; ++i){
ans+=min(leftMaxVec[i], rightMaxVec[i])-arr[i];
}
return ans;
}
};