🧩Algo 双指针

42. 接雨水

难度:🔴 Hard | 标签:双指针、动归、单调栈 | 状态:⬜ LeetCode 链接

思路

每个位置能接的水 = min(左侧最高, 右侧最高) - h[i]

双指针法(最优):维护 lmax / rmax,每次处理较低一边——因为低的一边的水量只由该侧 max 决定。

代码

class Solution {
public:
    int trap(vector<int>& h) {
        int l = 0, r = h.size() - 1;
        int lmax = 0, rmax = 0, res = 0;
        while (l < r) {
            if (h[l] < h[r]) {
                lmax = max(lmax, h[l]);
                res += lmax - h[l];
                ++l;
            } else {
                rmax = max(rmax, h[r]);
                res += rmax - h[r];
                --r;
            }
        }
        return res;
    }
};

复杂度

  • 时间 O(n),空间 O(1)
  • DP 解法:O(n) 时间 O(n) 空间;单调栈:按层累加

易错 / 回顾

  • 难点:为何处理较低一边时可直接结算?因为另一侧 max ≥ 当前侧 max
  • 单调栈解法是「按行 / 按层」累加,思路完全不同
  • 三种解法各练一次(DP、双指针、单调栈),讲项目时可对比
Related · 双指针