7.接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例1:
image

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

  • n == height.length
  • 1 <= n <= 2 * 104
  • 0 <= height[i] <= 105

代码:

class Solution {
    public int trap(int[] height) {
        //left数组表示每个柱子左侧最高柱子的高度(包括自己在内)
        int[] left = new int[100005];
        //right数组表示每个柱子右侧最高柱子的高度(包括自己在内)
        int[] right = new int[100005];
        //n表示height数组的长度
        int n = height.length;
        //如果是第一根柱子,则其左侧最高柱子只能是自己
        left[0] = height[0];
        for(int i = 1;i<n;i++){
            //否则,第i根柱子左侧(包括自己)最高柱子的高度 = max(第i-1根柱子左侧最高柱子的长度,第i根柱子的高度)
            left[i] = Math.max(left[i-1],height[i]);
        }
        //如果是最后一根柱子,则其右侧最高柱子只能是自己
        right[n-1] = height[n-1];
        for(int i = n-2;i>=0;i--){
            ////否则,第i根柱子右侧(包括自己)最高柱子的高度 = max(第i+1根柱子右侧最高柱子的长度,第i根柱子的高度)
            right[i] = Math.max(right[i+1],height[i]);
        }
        //res用于记录总接水量
        int res = 0;
        //循环遍历n根柱子,第i根柱子所能接水的量即为min(第i根柱子左侧(包括自己)最高柱子的长度,第i根柱子右侧(包括自己)最高柱子的长度)-第i根柱子的高度
        //累加结果
        for(int i=0;i<n;i++)res += Math.min(left[i],right[i])-height[i];
        //返回总接水量
        return res;
    }
}
posted @ 2025-03-14 19:55  回忆、少年  阅读(17)  评论(0)    收藏  举报