1. 问题背景与核心挑战
这道经典的接雨水问题考察的是对数组特性的理解和空间优化能力。给定一个非负整数数组表示的高度图,计算下雨后这个地形能接多少雨水。看似简单的问题背后隐藏着几个关键难点:
- 如何准确判断每个位置能否形成"水洼"
- 如何处理不同高度的柱子形成的复杂地形
- 如何优化计算避免重复遍历
我第一次遇到这个问题时,最直观的想法是逐列计算雨水容量,但很快发现需要左右两侧的最高柱子信息。这直接引出了预处理数组的思路——通过预先计算每个位置的左右最大值来快速判断蓄水高度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 预处理解法完整解析
2.1 算法思路拆解
核心思想可以分解为三个关键步骤:
-
预处理左右最大值数组:
- leftMax[i] 表示位置i左侧(包括i)的最高柱子
- rightMax[i] 表示位置i右侧(包括i)的最高柱子
-
计算每个位置的蓄水量:
水位高度由左右两侧较矮的柱子决定(木桶原理)
实际蓄水量 = min(leftMax, rightMax) - height[i] -
累加总雨水容量:
遍历所有位置,将有效蓄水量相加
2.2 Java实现详解
java复制public int trap(int[] height) {
if (height == null || height.length == 0) return 0;
int n = height.length;
int[] leftMax = new int[n];
int[] rightMax = new int[n];
// 从左向右预处理
leftMax[0] = height[0];
for (int i = 1; i < n; i++) {
leftMax[i] = Math.max(leftMax[i-1], height[i]);
}
// 从右向左预处理
rightMax[n-1] = height[n-1];
for (int i = n-2; i >= 0; i--) {
rightMax[i] = Math.max(rightM
