关注

【大一小登从从零开始学习算法 | 第十天 | 42.接雨水】

【大一小登从从零开始学习算法 | 第十天 | 42.接雨水】

每日一言

今天总算是把接雨水看明白了(应该吧) 本来以为今天也写不了 但没想到写出来了
真的有一种茅塞顿开的感觉

42.接雨水

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

示例 1:
在这里插入图片描述

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
示例 2:

输入:height = [4,2,0,3,2,5]
输出:9

提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

class Solution {
    public int trap(int[] height) {
        //初始化答案为0
        int ans=0;

        //定义前缀高度的最大值
        int preMax=0;

        //定义后缀高度的最大值
        int sufMax=0;

        //左指针指向数组第一个元素
        int left=0;

        //右指针指向数组最后一个元素
        int right=height.length-1;

        //当左右指针不重合时
        while(left<right){
            //更新前缀的最大值
            preMax=Math.max(preMax,height[left]);

            //更新后缀的最大值
            sufMax=Math.max(sufMax,height[right]);

            //当前缀最大值小于后缀最大值时
            if(preMax<sufMax){
                //答案更新
                ans+=preMax-height[left];

                //左指针右移
                left++;
            }else{
                ans+=sufMax-height[right];
                right--;
            }
        }
        return ans;
    }
}

解释(个人理解):
于其叫做前缀最大值 后缀最大值 我觉的叫接水板和挡水板更加好理解
前缀最大值 后缀最大值 那个更小乃个就是接水板
为什么

if(preMax<sufMax){
                //答案更新
                ans+=preMax-height[left];

                //左指针右移
                left++;
            }else{
                ans+=sufMax-height[right];
                right--;

就要更新答案呢 我昨天就一直被这个问题困扰
就以图片为例 假设这时preMax=1 sufMax=3 我们假设两个中间没有任何的方块
那么我们高度为一的方块旁边 是不是也可以接到水啊 也就是说只要挡水板大于等于接水板 就可以接到水

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/gzh070923/article/details/158893452

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--