Leecode42 trapping-rain-water

题目描述

给出n个数字,表示一个高程图,高程图中每一条的宽度为1,请计算下雨之后这个地形可以存储多少水
例如
给出[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个单位的雨水(蓝色部分)被存储。

分析

  • 用 i j 两个指针分别从前向后,从后向前运动。
  • 用 leftmax 记录 i 指针遍历过的最大值
  • 用 rightmax 记录j 指针遍历过的最大值
  • 相当于 i 左边 ,j右边的边界是已知的
  • 如果 leftmax < rightmax 由于短板效应,i 处的水量一定取决于leftmax,无论i j之间有更高的或者更矮的。
  • 反之,可以计算j处的水量。

java 代码

public class Solution {
    public int trap(int[] A) {
        if(A == null || A.length < 3){
            return 0;
        }
        
        int i = 0;
        int j = A.length - 1;
        int leftmax = 0;
        int rightmax = 0;
        int res = 0;
        while(i <= j){
            //记录 i左边最高的(包括i)
            leftmax = Math.max(leftmax,A[i]);
            // j右边最高的(包括j)
            rightmax = Math.max(rightmax,A[j]);
            //此时对于 i j 他们左边和右边的边界(就像是桶的最短边一样)已经知道了
            if(leftmax < rightmax){
                res += leftmax - A[i]; 
                i++;
            }else{
                res += rightmax - A[j]; 
                j--;
            }
        }
        return res;
        
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,111评论 0 2
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,654评论 1 42
  • 贪心算法 贪心算法总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上...
    fredal阅读 9,446评论 3 52
  • 题目来源:1、中兴、华为、慧通、英华达、微软亚洲技术中心等中外企业面试题目;2、C 语言面试宝典(林锐《高质量编程...
    月震阅读 2,057评论 0 1
  • 2018年七月 夏 离开北京 坐上车后,我好像和这个城市就再无一点关系。 北京真的很大,五环外上班到住的地方还要倒...
    司辰的司阅读 584评论 0 1

友情链接更多精彩内容