class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
vector<int> left_max(n);
vector<int> right_max(n);
left_max[0]=height[0];
right_max[n-1]=height[n-1];
//求出左边最大值
for(int i=1;i<n;++i){
left_max[i]=max(left_max[i-1],height[i]);
}
//求出右边最大值
for(int i=n-2;i>=0;--i){
right_max[i]=max(right_max[i+1],height[i]);
}
long long ans=0;
for(int i=0;i<n;++i){
ans+=min(left_max[i],right_max[i])-height[i];
}
return ans;
}
};
二、双指针
cpp复制代码
class Solution {
public:
int trap(vector<int>& height) {
int n=height.size();
int left_max=height[0];
int right_max=height[n-1];
int left=0;
int right=n-1;
long long ans=0;
while(left<right){
left_max=max(left_max,height[left]);
right_max=max(right_max,height[right]);
if(left_max>right_max){//说明右边这个right柱子 取决于 其右边的最高高度。
ans+=right_max-height[right];
--right;
}else{
ans+=left_max-height[left];
++left;
}
}
return ans;
}
};