Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
时间复杂度(O(n))
空间复杂度(O(1))
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
if(n<2) return 0;
int left=0,right=n-1,res=0,minh=0;
while(left<right){
minh=min(height[left],height[right]);
if(minh==height[left]){
while((++left<right)&&(height[left]<minh)){
res=res+minh-height[left];
}
}else{
while((--right>left)&&(height[right]<minh)){
res=res+minh-height[right];
}
}
}
return res;
}
};
void main(){
int a[]={0,1,0,2,1,0,1,3,2,1,2,1},n=12;
vector<int> height;
height.reserve(n);
height.assign(&a[0],&a[n]);
Solution So;
int res=So.trap(height);
cout<<res<<endl;
}
#include<vector>
#include<iostream>
using namespace std;
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
if(n<2) return 0;
int left=0,right=n-1,res=0,i=0,j=0,s=0,d=0;
while(left<right){
while((left<n-1)&&(height[left]<height[left+1])){
++left;
}
while((right>0)&&(height[right]<height[right-1])){
--right;
}
if(height[left]<height[right]){
i=left+1;
s=0;
while((i<right)&&(height[left]>height[i])){
s=s+height[i];
++i;
}
d=i-left-1;
if(d>0){
res=res+height[left]*d-s;
}
left=i;
}else{
j=right-1;
s=0;
while((j>left)&&(height[right]>height[j])){
s=s+height[j];
--j;
}
d=right-j-1;
if(d>0){
res=res+height[right]*d-s;
}
right=j;
}
}
return res;
}
};
void main(){
int a[]={0,1,0,2,1,0,1,3,2,1,2,1},n=12;
vector<int> height;
height.reserve(n);
height.assign(&a[0],&a[n]);
Solution So;
int res=So.trap(height);
cout<<res<<endl;
}