Skip to content

双指针法:动态维护左侧最高点(前缀最大值)和右侧最高点(后缀最大值)。 某个位置能接的雨水量,由其左右两端最高柱子中的较矮者决定, 即能接的雨水量 = min(最大前缀, 最大后缀) - 当前的高度。

java
class Solution {
    /**
     * 双指针法:动态维护左侧最高点(前缀最大值)和右侧最高点(后缀最大值)。
     * 某个位置能接的雨水量,由其左右两端最高柱子中的较矮者决定,
     * 即能接的雨水量 = min(最大前缀, 最大后缀) - 当前的高度。
     */
    public int trap(int[] height) {
        int len = height.length;
        int left = 0, right = len - 1;
        int ans = 0;
        int pre = 0, suf = 0;
        while (left <= right) {
            int i = left >= 0 ? height[left] : -1;
            int j = right < len ? height[right] : -1;
            if (i < j) {
                // 这个位置能接的水的多少由left决定
                if (pre > i) {
                    ans += pre - i;
                }
                pre = Math.max(pre, i);
                left++;
            } else {
                // 这个位置能接多少水由right决定
                if (suf > j) {
                    ans += suf - j;
                }
                suf = Math.max(suf, j);
                right--;
            }
        }
        return ans;
    }
}

Personal Knowledge Base