LeetCode 热题 42.接雨水(双指针写法)
题目
思路:
我们知道柱子想要接水需要左右两边有比自己高的柱子,并且水面由矮的那根柱子决定。最简单想到的就是遍历一遍,先存下没个柱子左右两边最高的柱子高度。
我们可以在这里优化一下,用两个指针 l ,r 从 0 和 n-1 出发,动态记录目前左右两边最高的柱子高度,边走边更新。每一步比较一下当前左右两边最高柱子的高度谁矮,矮的一边往里面走一格,并立即计算这根柱子和这根柱子所在侧的最高柱子的高度差,这就是这根柱子的接水量,因为我们是先更新最高柱子的高度,再计算接水量,所以这根柱子的高度一定 <= min(左边最高柱子的高度, 右边最高柱子的高度),并且 水面高度已经被矮墙卡死,不会多算。
代码如下:
int len = height.size();if (len < 3) return 0; int ans = 0;int l = 0, r = len - 1;int lmax = height[l], rmax = height[r];while (l < r){lmax = max(height[l], lmax);rmax = max(height[r], rm ax);// 谁矮 哪边往里走,因为水面由矮墙决定if (lmax < rmax){ans += lmax - height[l ++]; } else ans += rmax - height[r --];}return ans;