42. 接雨水

1.双指针法
public int trap(int[] height) {
int ans = 0;
int l=0,r=height.length-1;
int lMax=height[0],rMax=height[r];
while(l<r){
if(height[l]<height[r]){
lMax=Math.max(height[l],lMax);
ans+=lMax-height[l];
l++;
}else{
rMax=Math.max(height[r],rMax);
ans+=rMax-height[r];
r--;
}
}
return ans;
}

2.动态规划
public int trap(int[] height) {
int n = height.length;
if (n == 0) {
return 0;
}

    int[] leftMax = new int[n];
    leftMax[0] = height[0];
    for (int i = 1; i < n; ++i) {
        leftMax[i] = Math.max(leftMax[i - 1], height[i]);
    }

    int[] rightMax = new int[n];
    rightMax[n - 1] = height[n - 1];
    for (int i = n - 2; i >= 0; --i) {
        rightMax[i] = Math.max(rightMax[i + 1], height[i]);
    }

    int ans = 0;
    for (int i = 0; i < n; ++i) {
        ans += Math.min(leftMax[i], rightMax[i]) - height[i];
    }
    return ans;

}

posted @ 2025-12-09 14:43  acccccccccc  阅读(5)  评论(0)    收藏  举报