这个题目和上面盛水最多的容器一样,那个题目是用双指针,左右比较,如果左边小就移动左边,如果右边小就移动右边
大
暴力法:
这个题目是接雨水,可以从第一个到最后一个遍历,对于每个数。分别往左往右找到最大的值,然后取最大值的最小值减去该值就是这个位置的水量
class Solution {
public:
int trap(vector<int>& height) {
int ans=0;
for(int i=0;i<height.size()-1;i++){
int max_l=0,max_r=0;
for(int j=i;j>=0;j--){//往左边找最大值
max_l=max(height[j],max_l);
}
for(int j=i;j<height.size();j++){//往右找最大值
max_r=max(height[j],max_r);
}
ans=ans+min(max_r,max_l)-height[i];
}
return ans;
}
};
还可以用动态规划来做,分别创建两个数组,记录每个位置,从左边的最大值(1-n-1),从右边的最大值(0-n-2)
//使用动态规划,创建左右两个数组
int n=height.size();
vector<int> left(n);//创建数组
vector<int> right(n);
left[0]=height[0];
for(int i=1;i<n;i++){
left[i]=max(left[i-1],height[i]);//i处左边最大值是前面最大值和自己比较的最大值
}
right[n-1]=height[n-1];
for(int i=n-2;i>=0;i--){
right[i]=max(right[i+1],height[i]);//i处右边最大值是他右边那个位置右边最大值和自己的比
}
int res=0;
for(int i=0;i<n;i++){
res=res+min(left[i],right[i])-height[i];
}
return res;
用双指针,需要左右指针和左右的最大值四个变量,如果左边的值小于右边的值,对应的左边的最大化值肯定小于右边的最大值,所以左边计算水量,左边++
//用双指针的方法
int l=0,r=height.size()-1;
int lmax=0,rmax=0;
int res=0;
while(l<r){
lmax=max(height[l],lmax);
rmax=max(height[r],rmax);
if(height[l]<=height[r]){
res=res+lmax-height[l];
l++;
}
else{
res=res+rmax-height[r];
r--;
}
}
return res;