题目描述:
思路1:从0到size遍历一遍数组,对于位置i处的雨水量为i左边的最大值(包括点i处)和i右边的最大值(包括点i处)二者的最小值减去i的高度。
class Solution {
public:
int trap(vector<int>& height) {
int res=0;
for(int i=1;i<height.size();i++){
int max_left=0,max_right=0;
//左边的最大值
for(int j=i;j>=0;j--){
max_left=max(max_left,height[j]);
}
//右边的最大值
for(int j=i;j<height.size();j++){
max_right=max(max_right,height[j]);
}
//位置i处的雨水量
res+=min(max_left,max_right)-height[i];
}
return res;
}
};
思路2:首先将位置i左端的最大值存入到left_max容器中,将位置i右端的最大值存入到right_max容器中,然后遍历即可。
class Solution {
public:
int trap(vector<int>& height){
int res=0;
int size=height.size();
if(size==0) return 0;
//存储i左边和右边最大值的数组初始化
vector<int>left_max(size),right_max(size);
left_max[0]=height[0];
for(int i=1;i<size;i++){
left_max[i]=max(left_max[i-1],height[i]);
}
right_max[size-1]=height[size-1];
for(int i=size-2;i>=0;i--){
right_max[i]=max(right_max[i+1],height[i]);
}
for(int i=0;i<height.size();i++){
res+=min(left_max[i],right_max[i])-height[i];
}
return res;
}
};
思路3:双指针
class Solution {
public:
int trap(vector<int>& height){
int res=0;
int size=height.size();
int left=0,right=size-1;
int left_max=0,right_max=0;
while(left<right){
//始终对较小的一端进行操作
if(height[left]<height[right]){
//只有当前位置的高度小于当前最大值时,计算雨水面积,否则只更新最大值
height[left]>=left_max?(left_max=height[left]):res+=(left_max-height[left]);
//更新指针
left++;
}else{
height[right]>=right_max?(right_max=height[right]):res+=(right_max-height[right]);
right--;
}
}
return res;
}
};