classSolution{public:inttrap(vector<int>& height){int n = height.size();int* pre =newint[n];int* suf =newint[n];memset(pre,0,sizeof(int)* n);memset(suf,0,sizeof(int)* n);for(int i =0, maxHeight =0; i < n;++i)
pre[i]= maxHeight =max(maxHeight, height[i]);for(int i = n -1, maxHeight =0; i >0;--i)
suf[i]= maxHeight =max(maxHeight, height[i]);int result =0;for(int i =0; i < n;++i){
result +=min(pre[i], suf[i])- height[i]>0?min(pre[i], suf[i])- height[i]:0;}return result;}};
双指针
classSolution{public:inttrap(vector<int>& height){int n = height.size();int result =0;int left =0, right = n -1;int leftMax =0, rightMax =0;while(left <= right){// 不要少判断最中间的位置if(leftMax < rightMax){// 如果leftMax小,那么leftMax可信,利用它可以求left可以存储的rain water
leftMax > height[left]?
result += leftMax - height[left]:(leftMax = height[left]);++left;}else{
rightMax > height[right]?
result += rightMax - height[right]:(rightMax = height[right]);--right;}}return result;}};