算法:接雨水

题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]

输出:6
image

此题初看很困难,但是理解了解题思路之后,代码逻辑比较简单,重点是找到怎样加水的规律。

解题方法:双指针和动态规划

思路梳理:

  1. 使用双指针,左指针和右指针初始值为数组起始和末尾。

  2. 用双指针遍历数组(循环条件为左指针小于右指针),直到两指针相遇。

  3. 每次比较左右元素大小,去低的一侧加水,然后移动该侧的指针。

  4. 加水的原则是该侧具有高度差(加水量是此元素与此侧最高值的高度差)

我的 Java 代码:

       public int trap(int[] height) {
        int left = 0;
        int right = height.length-1;;
        int lmax = 0;
        int rmax = 0;
        int water = 0; // 总水量
        // 用双指针遍历数组,每次只移动一个指针
        while(left<right)
        {
            // 当左指针元素小于右指针元素,去左侧加水
            if(height[left]<height[right])
            {
                //更新左侧最高值
                lmax = Math.max(height[left],lmax);
                //更新总水量=上次总水量+加水量
                water + = lmax-height[left];
                //左指针往右移
                left++;
            }
            // 当右指针的元素小于左指针,则去右侧加水。目的为了使指针遍历完数组。
            else
            {
                rmax = Math.max(height[right],rmax);
                water += rmax-height[right];
                right--;
            }
        }
        return water;
    }
posted @ 2025-07-21 01:46  junjunyi  阅读(41)  评论(0)    收藏  举报