当前位置: 首页 > article >正文

力扣每日一题day26[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

按照列方向计算,只要记录左边柱子的最高高度和右边柱子的最高高度,就可以计算出当前位置雨水的面积;当前位置的雨水面积=[min(左边柱子的最高高度,右边柱子的最高高度)-当前柱子高度]x1

使用双指针来遍历,每到一个柱子都向两边遍历一遍,会有重复计算,我们将每个位置左边最高高度记录在一个数组中,右边最高高度记录在一个数组中

当前位置左边最高高度是前一个位置左边最高高度和本高度比较后的最大值

  • 从左向右:maxLeft[i]=max(height[i],maxLeft[i])

  • 从右向左:maxRight[i]=max(height[i],maxRight[i+1])

class Solution {
    public int trap(int[] height) {
        int len=height.length;
        if(len<=2) return 0;
        int[] maxLeft=new int[len];
        int[] maxRight=new int[len];
​
        maxLeft[0]=height[0];
        for(int i=1;i<len;i++){
            maxLeft[i]=Math.max(height[i],maxLeft[i-1]);
        }
​
        maxRight[len-1]=height[len-1];
        for(int i=len-2;i>=0;i--){
            maxRight[i]=Math.max(height[i],maxRight[i+1]);
        }
​
        int sum=0;
        for(int i=0;i<len;i++){
            int count=Math.min(maxLeft[i],maxRight[i])-height[i];
            if(count>0) sum+=count;
        }
        return sum;
    }
}

http://www.kler.cn/a/155441.html

相关文章:

  • Vue 的生命周期函数 和 Vuex
  • 智能电视/盒子的应用管理——通过ADB工具优化体验
  • 一种基于深度学习的反无人机无人值守系统及方法
  • idea 解决缓存损坏问题
  • 「数据要素」行业简报|2024.11.上刊
  • Ai创作新风标!仅需三步,利用ai工具免费制作抖音爆款的动物融合视频(含完整的步骤)
  • 游泳馆会员服务预约管理系统预约小程序效果如何
  • TypeScript 的安装与使用
  • python每日一题——21搜索二维矩阵
  • JVM——内存溢出和内存泄漏
  • 【知识】稀疏矩阵是否比密集矩阵更高效?
  • python动态圣诞下雪图
  • vue-历史模式部署
  • 【面试HOT200】回溯篇
  • Node.js版本管理工具NVM(Node Version Manager)的使用
  • leetcode - 矩阵区域和
  • 第十五届蓝桥杯模拟赛(第二期)
  • 软件生命周期四个阶段SDLC
  • Day59权限提升-win溢出漏洞ATSCps提权
  • 三菱(MITSUBISHI)CNC数据采集
  • 打印时如何让打印字体更加平滑 不那么锯齿化
  • csapp-linklab
  • AArch64中的虚拟化
  • 【Android】Retrofit创建实例源理
  • Flyway 数据库版本管理 | 专业解决方案
  • 31、LCD1602功能函数代码