前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数组-接雨水

数组-接雨水

原创
作者头像
一只眠羊
修改2021-04-08 15:01:45
3090
修改2021-04-08 15:01:45
举报

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

image.png
image.png

通用公式:currentWater = min(maxL,maxR) - CH(当前这一项)

暴力算法
    const elevationArray = [0,1, 0,2, 1,0,3,1,0,1,2]
    const getTrappedRainwater =  function(heights){
        let totalWater = 0;
        for(let p = 0;p<heights.length;p++){
            let leftP = p,rightP = p,maxLeft = 0,maxRgith  =0;
            while(leftP>=0){
                maxLeft = Math.max(heights[leftP],maxLeft)
                leftP--
            }
            while(rightP<heights.length){
                maxRgith = Math.max(heights[rightP],maxRight)
                rightP++
            }
            const currentWater = Math.min(maxLeft,maxRgith) - heights[p]
            if(currentWater >= 0){
                totalWater += currentWater
            }
        }

    }

时间复杂度:O(n^2)

空间复杂度:O(1)

优化
    const getTrappedRainwater = function(heights){
        let left = 0,
            right  = heights.length -1,
            totalWater = 0,
            maxLeft = 0,
            maxRgith = 0;
        while(left<right){
            if(heights[left]<=heights[right]){
                if(heights[left] >= maxLeft){
                    maxLeft = heights[left]
                }else{
                    totalWater += maxLeft - heights[left]           
                }
                left++
            }else{
                if(heights[right] >= maxRight){
                    maxRight = heights[right]
                }else{
                    totalWater += maxRgith - heights[right]
                }
                right--
            }
        }
    }

时间复杂度 O(n)

空间复杂度 O(1)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 暴力算法
  • 优化
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档