双指针

接雨水

困难#42Java时间 O(n)空间 O(1)

题目要做什么

非负整数表示宽度为 1 的柱子高度。求下雨后柱子之间能积存多少单位水。

题目示例输入height = [0,1,0,2,1,0,1,3,2,1,2,1]
题目示例输出6

01 为什么这样做

某个位置的水位由两边最高柱子的较小者决定。双指针每次处理当前较低的一侧,更新这一侧的最高值并累加水量。

始终成立的条件

已处理位置的积水量已经确定,未处理区域位于 left 与 right 之间。

02 看见算法执行

动画与代码同步

修改输入,播放自己的例子

当前使用题目示例
修改输入会改变执行过程;预期输出用于核对结果。
数组 / nums步骤 1
执行状态
本次演示输出播放到最后查看

Solution.java参考解法
1class Solution {2    public int trap(int[] height) {3        int left = 0, right = height.length - 1;4        int leftMax = 0, rightMax = 0, water = 0;5        while (left <= right) {6            if (height[left] <= height[right]) {7                leftMax = Math.max(leftMax, height[left]);8                water += leftMax - height[left];9                left++;10            } else {11                rightMax = Math.max(rightMax, height[right]);12                water += rightMax - height[right];13                right--;14            }15        }16        return water;17    }18}

键盘控制:A 后退 · D 前进

编程练习

↑↓ 选择↵ 打开Pagefind 全文检索