LongDz 的数字文墨提案

42. 接雨水

3 min

题目

42. 接雨水 困难

思路

核心思想是双指针贪心算法,通过维护左右指针和两侧最大高度值,每次移动高度较小的一侧指针并累加雨水量。

正确性基于木桶原理:当前位置的积水量由左右最大高度的较小值决定。当左指针高度小于右指针时,左指针位置的积水量仅取决于左侧最大高度(因为右侧最大高度已足够高且不会小于当前右指针高度),移动左指针不会遗漏最优解;反之亦然。这种策略确保每个位置在指针移动过程中被精确计算一次。

  • Step 1: 初始化左右指针和左右最大高度变量
  • Step 2: 循环比较左右指针高度,更新对应侧最大高度
  • Step 3: 根据较小高度侧计算积水量并移动指针
  • Step 4: 循环结束后返回累加结果

复杂度

  • 时间复杂度: O(n)O(n),每个元素仅被访问一次,瓶颈在双指针的线性扫描过程。
  • 空间复杂度: O(1)O(1),仅使用固定数量的指针和高度变量,无额外数据结构。

代码

class Solution {
    public int trap(int[] height) {
        int ans = 0;
        int left = 0, right = height.length - 1;
        int leftMax = 0, rightMax = 0;
        while (left < right) {
            leftMax = Math.max(leftMax, height[left]);
            rightMax = Math.max(rightMax, height[right]);
            if (height[left] < height[right]) {
                ans += leftMax - height[left];
                ++left;
            } else {
                ans += rightMax - height[right];
                --right;
            }
        }
        return ans;
    }
}