当前位置: 面试刷题>> 接雨水 (经典算法题500道)


题目描述补充

题目:接雨水

给定一个整数数组 height,其中 height[i] 代表坐标索引为 i 的位置的高度。这里,我们假设天降暴雨之后,只有高度比它两侧都高的位置可以积水(我们称这些位置为“洼地”)。每一单位宽度的“洼地”可以积存的水量等于它两侧高度的较小值减去它自己的高度。你需要计算按此规则,数组中接到的雨水量总和。

示例

输入: height = [0,1,0,2,1,0,1,3,2,1,2,1]

输出: 6

解释:

坐标 0, 1, 2 处的洼地可以积水,积水量分别为 0, 1, 0。 坐标 4, 5, 6 处的洼地可以积水,积水量分别为 1, 0, 1。 坐标 8, 9, 10 处的洼地可以积水,积水量分别为 0, 0, 2。 总和为 0 + 1 + 0 + 1 + 0 + 1 + 0 + 0 + 2 = 6。

PHP 示例代码

function trap($height) {
    $n = count($height);
    if ($n <= 2) {
        return 0;
    }

    $leftMax = array_fill(0, $n, 0);
    $rightMax = array_fill(0, $n, 0);

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

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

    $totalWater = 0;
    for ($i = 1; $i < $n - 1; $i++) {
        $totalWater += min($leftMax[$i], $rightMax[$i]) - $height[$i];
    }

    return $totalWater;
}

// 测试示例
$height = [0,1,0,2,1,0,1,3,2,1,2,1];
echo trap($height); // 输出 6

Python 示例代码

def trap(height):
    n = len(height)
    if n <= 2:
        return 0

    left_max = [0] * n
    right_max = [0] * n

    left_max[0] = height[0]
    for i in range(1, n):
        left_max[i] = max(left_max[i - 1], height[i])

    right_max[n - 1] = height[n - 1]
    for i in range(n - 2, -1, -1):
        right_max[i] = max(right_max[i + 1], height[i])

    total_water = 0
    for i in range(1, n - 1):
        total_water += min(left_max[i], right_max[i]) - height[i]

    return total_water

# 测试示例
height = [0,1,0,2,1,0,1,3,2,1,2,1]
print(trap(height))  # 输出 6

JavaScript 示例代码

function trap(height) {
    const n = height.length;
    if (n <= 2) {
        return 0;
    }

    const leftMax = new Array(n).fill(0);
    const rightMax = new Array(n).fill(0);

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

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

    let totalWater = 0;
    for (let i = 1; i < n - 1; i++) {
        totalWater += Math.min(leftMax[i], rightMax[i]) - height[i];
    }

    return totalWater;
}

// 测试示例
const height = [0,1,0,2,1,0,1,3,2,1,2,1];
console.log(trap(height)); // 输出 6

码小课 网站中有更多关于算法和数据结构的内容分享给大家学习,欢迎访问并深入学习!