当前位置: 面试刷题>> 接雨水 (经典算法题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 示例代码 ```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 示例代码 ```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 示例代码 ```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 ``` **码小课** 网站中有更多关于算法和数据结构的内容分享给大家学习,欢迎访问并深入学习!
推荐面试题