LeetCode42. 接雨水(第二篇)

LeetCode42. 接雨水(第二篇)

上一篇博客,是按照行,层层向上,计算。我觉得没什么问题,但是没通过。因为用例太长还没能在本地自测

  • 这个的思路是当前列能存储多少水
    当前列存储能存储多少水取决于:左边最高柱子,和右边最高的柱子,以及自己的底部
    可以想象,当柱子数组长度小于3(height.length<=2),无法装水,直接返回0
    能装多少水,取决一左右最高峰最短的,较矮的那个int temp = Math.min(leftHigh,rightHigh) - height[i];,减去底部,就是装水的容量。(如果是负或者0代表无法装水)

好了现在思路就很清楚了,我们只需要知道三个数据,左边最高峰leftHigh,右边最高峰rightHigh,当前底部height[i]就能求出当前列能装多少水

把所有的的当前列(height[1],到倒数第二列)求和,就得出一共的容量

执行结果:通过
执行用时 :130 ms, 在所有 Java 提交中击败了5.06% 的用户
内存消耗 :39.9 MB, 在所有 Java 提交中击败了11.78% 的用户

可以看出我的算法,效率不高,但是:要啥自行车!要啥手表
先填饱肚子再说吧

  • 代码如下:
class Solution {
    public int trap(int[] height) {
        //长度为小于2直接返回
        if (height.length<=2)
            return 0;
        //来自题解的思路 按列求
        //左边最高的墙
        int leftHigh = 0;
        //右边最高的墙
        int rightHigh = 0;
        //水容量
        int waterSum = 0;

        for (int i = 1; i<height.length-1; i++){

            leftHigh = maxHigh(height,0,i);
            rightHigh = maxHigh(height,i+1,height.length);
            //能装多少水取决于最短的板 再减去底部
            int temp = Math.min(leftHigh,rightHigh) - height[i];
            if (temp>0){
                waterSum += temp;
            }
        }
        return waterSum;
    }
    //找出该区间最大的值
    int maxHigh(int[] height, int left,int right){
        int temp=0;
        for (int i=left;i<right;i++){
            if (temp<height[i]) temp=height[i];
        }
        return temp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值