博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Trapping Rain Water@LeetCode
阅读量:7122 次
发布时间:2019-06-28

本文共 1483 字,大约阅读时间需要 4 分钟。

这道题当时也是花了我不少脑力呀,总感觉方法就在边上了,但是总是差一点点。

这一题的主要问题就在于:如何找到『坑』。

  • 其一,理论上来讲,如果当前处在上升阶段(y在增大),那么就应该正在形成一个『坑』。
  • 其二,知道现在处在『坑』了,就该算坑有多大,但是这里的难点在于如果以当前点为『坑』的右边缘,那么会遇到下一个位置可能更高,那么下一个位置才应该是『坑』的右边缘,同时还要注意左右边缘高度的比较,如果右边缘已经高于左边缘了,那么当前这个『坑』的大小就无法再增加了,反之则还有继续增大的可能。那么这里就要执行一个动作来方便之后的计算和判断:『填坑』。如果当前位置的高度低于左边缘,那么就先把已知的『坑』填平,也就是把『坑』中的每个位置就填到和右边缘一样高,并记录下来填坑的大小,再继续下一个位置;如果当前位置的高度高于左边缘,那么当前『坑』的大小不会再变了,直接用左边缘的高度高度为标尺扫一遍『坑』,把不平的地方填平即可,当然也要记录下填坑的大小。这个方法的好处在于,『坑』的每一个位置都不会被重复填,可以使代码简化并且不容易出错。

实现代码:

javapublic class Solution {    public int trap(int[] A) {        if (A == null || A.length == 0)            return 0;        int leftHeight = 0, left, cap = 0, index = 0;        while (index < A.length && A[index] == 0) {            index++;        }        if (index == A.length)            return cap;        left = index;        leftHeight = A[index++];        for (; index < A.length; index++) {            int height = A[index];            if (A[index - 1] < A[index]) {                if (leftHeight > height) {                    int i = index - 1, min = 0;                    for (; A[i] < A[index]; i--) {                        cap += A[index] - A[i];                        A[i] = A[index];                    }                } else {                    for (int i = index - 1; i > left; i--) {                        cap += leftHeight - A[i];                    }                    leftHeight = height;                    left = index;                }            }        }        return cap;    }}

转载地址:http://nbsel.baihongyu.com/

你可能感兴趣的文章
杨辉三角
查看>>
C#常用控件缩写
查看>>
POJ 2195 Going Home(最小费用最大流)题解
查看>>
【GTK3.0】背景设置
查看>>
网络流
查看>>
杭电2027--统计元音
查看>>
SSH远程启动tomcat后,退出SSH,tomcat也退出
查看>>
一个压缩算法
查看>>
iOS ipv6审核被拒绝的解决方案(已审核通过)
查看>>
bind 配置
查看>>
maven 转 gradle
查看>>
[整理]国际学术会议
查看>>
centos 7 更换yum源
查看>>
如何设置xshell代理?
查看>>
Codeforces 1103 E. Radix sum
查看>>
iOS后台播放音乐
查看>>
查看python版本和django版本
查看>>
【转】beyond compare 启动提示“应用程序发生错误”
查看>>
关于线程的停止、挂起、退出(修改)
查看>>
轮播2-css
查看>>