1.题目
2.动态规划法(计算两边最大高度)
坐标为 i 的点最多能接到的雨水是左右两边最高高度中的较小值-height[i]
class Solution {
public:
int trap(vector<int>& height) {
int n = height.size();
if(n==0){return 0;}
vector<int> leftMax(n);
leftMax[0]=height[0];
//求i左边最高值
for(int i=1;i<n;i++){
leftMax[i]=max(leftMax[i-1],height[i]);
}
vector<int> rightMax(n);
rightMax[n-1]=height[n-1];
for(int i=n-2;i>=0;i--){
rightMax[i]=max(rightMax[i+1],height[i]);
}
int ans=0;
for(int i=0;i<n;i++){
ans += min(leftMax[i],rightMax[i])-height[i];
}
return ans;
}
};
3.双指针法
用双指针和两个变量代替两个数组
初始left=0 right=n-1 leftMax和rightMax=0,指针left只会向右移动,指针right只会向左移动
当两个指针没有相遇时,
当两指针相遇,就能得到雨水总量
class Solution {
public:
int trap(vector<int>& height) {
int ans = 0;
int left = 0, right = height.size()-1;
int leftMax = 0, rightMax = 0;
while(left<right){
leftMax=max(leftMax,height[left]);
rightMax=max(rightMax,height[right]);
if(height[left]<height[right]){
ans += leftMax - height[left];
left++;
}
else{
ans += rightMax-height[right];
right--;
}
}
return ans;
}
};