双指针法求解本题的基本头脑是:利用两个指针从数组的两端开始向中心移动,同时维护两个变量来记载左右双方的最大高度。这样可以在遍历过程中直接盘算每个位置能接住的雨水量,而无需提前盘算完整的左右最大高度数组。利用双指针法求解本题的主要步骤如下。
1、初始化两个指针 left 和 right 分别指向数组的开始和结束。
2、初始化两个变量 max_left 和 max_right 分别生存 left 和 right 指针所在位置左侧和右侧的最大高度,初始值都设为0。
3、用一个变量 water 来累计能接住的雨水量。
4、当 left < right 时,进行以下步骤。
(1)如果 height[left] < height[right],说明当前能接雨水的量受限于 height[left]。因此,更新 max_left 为 max(max_left, height[left]),并且累加到 water 中的雨水量为 max_left - height[left]。然后,将 left 指针向右移动一位。
(2)反之,如果 height[left] >= height[right],说明当前能接雨水的量受限于 height[right]。因此,更新 max_right 为 max(max_right, height[right]),累加到 water 中的雨水量为 max_right - height[right],并将 right 指针向左移动一位。
5、当 left >= right 时,遍历结束,返回累积的雨水量 water。
根据上面的算法步骤,我们可以得出下面的示例代码。