暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据结构和算法【46】接雨水

皮皮克克 2023-09-15
13

点击关注公众号,干货第一时间送达


这道题小编很早之前做过了,

不过一直没来得及更。

今天应朋友之邀,更了这题。

很经典的一道题,

一起来看看。


没错,就是大名鼎鼎的 "接雨水",

接雨水还有另外一个版本,是三维空间的:


后面这道大家有兴趣可以先自己看看,

今天咱们先聊聊第一题。


一、屏幕前的吴彦祖和刘亦菲们,请听题


举个例子:

height = [0,1,0,2,1,0,1,3,2,1,2,1]



题意简单,一目了然。

怎么求解呢?


二、解题

对于给定柱子数组  

height = [0,1,0,2,1,0,1,3,2,1,2,1]

怎么能接到雨水?

那必须是当前的柱子 height[i] 左右两边的柱子等于或高于它,

但是,如果我们关注某个柱子的近邻左右两侧,

是不好解题的。

我们应该关注当前柱子,左右两边界,

我们可以发现,只有左右边界能够挡住水,

也就是当前柱子低于左右边界,

不管其他柱子,水一定能够保留下来。

而我们每次只计算当前柱子,上面的地方可以保存多少水:


其他柱子不用管,因为在遍历中,后面会遍历到,

比如:

看看代码。



完整代码:

public class CodingDemo {

    /**
     * TODO; 接雨水
     * @param height
     * @return
     */

    private static int trap(int[] height) {
        if (height == null || height.length == 0){
            return 0;
        }

        int N = height.length;

        //记录左右两边最大值
        int maxLeft = height[0];
        int maxRight = height[N-1];

        //指针
        int left = 1;
        int right = N-2;

        //接到的雨水
        int all = 0;

        while (left <= right){
            if (maxLeft < maxRight){
                int cur = maxLeft - height[left];
                int rain = Math.max(cur, 0);
                all += rain;

                //更新左边界
                maxLeft = Math.max(maxLeft, height[left]);
                left++;
            } else {
                int cur = maxRight - height[right];
                int rain = Math.max(cur, 0);
                all += rain;

                //更新右边界
                maxRight = Math.max(maxRight, height[right]);
                right--;
            }
        }
        return all;
    }


    public static void main(String[] args) {

        int[] arr = {0,1,0,2,1,0,1,3,2,1,2,1};
        System.out.println(trap(arr));
    }
}

输出:

D:\java\bin\java.exe
6


去力扣试试:



结束语:
Ok,就是本篇文章的全部内容了。
如果各位有不懂的地方,欢迎发消息给小编,小编会进行详细地解答。
往期推荐:
数据结构和算法【45】计算器
数据结构和算法【44】让字符串成为回文串的最少插入次数
数据结构和算法【43】单词距离
最后,请屏幕前的各位吴彦祖和刘亦菲们,动动你们的小手,给小编一个

文章转载自皮皮克克,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论