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

【力扣】第42题:接雨水

原文链接:42. 接雨水 - 力扣(LeetCode)

1、题目解析

解读:给定一个数组,使数组的值为高形成柱子,按照短板效应原理能剩多少水。

核心思想:

        每一个坐标位置可以承装的水= min(左边最高柱子,右边最高柱子)- 该坐标值

 

2、编码实现

方法一

我们可以用两个数组,一个用来记录每一个坐标值的左边中柱子的最高值,一个用来记录每一个坐标值右边中柱子的最高值。当我们要记录某一个坐标值能盛装多少水时,根据上面提供的公式,只要在这两个数组中取出该坐标对应的值即可。

    /** 方法一:时间复杂度O(n),空间复杂度O(n)* 思路:对于每个位置i,能装的水量是:min(左边最高的柱子,右边最高的柱子)-height[i]*  1.先计算每个位置左边最高的柱子,存入pre_Max数组*  2.再计算每个位置右边最高的柱子,存入suf_Max数组*  3.遍历每个位置i,计算能装的水量,并累加到ans中* */public static int trap(int[] height) {int ans = 0;int len = height.length;int[] pre_Max = new int[len];pre_Max[0] = height[0];for(int i = 1;i<len;i++){pre_Max[i] = Math.max(pre_Max[i-1],height[i]);}int[] suf_Max = new int[len];suf_Max[len-1] = height[len-1];for(int j = len-2;j>=0;j--){suf_Max[j] = Math.max(suf_Max[j+1],height[j]);}int a=1;for(int k = 0;k<len;k++){int min = Math.min(suf_Max[k],pre_Max[k]);ans += min-height[k];}return ans;}

方法二:双指针

  1. 两指针分别从数组左右端点开始遍历
  2. 两个指针记录的是遍历到的最高值
  3. 对比左右指针的当前值,谁小谁移动
  4. 当指针遍历到某一节点时,因为是谁小谁移动,所以另一个指针的值一定是比当前指针的值大的,也就是说另一侧更高。
  5. 所以让盛装的水量+(当前这一侧的最大值 - 当前指针的值)

编码实现:

/** 优化:可以使用双指针,时间复杂度O(n),空间复杂度O(1)*  方法二:双指针* *  思路:使用双指针,左指针left和右指针right,初始时分别指向数组的两端*  1、两指针分别从数组左右端点开始遍历*  2、两个指针记录的是遍历到的最高值*  3、对比左右指针的当前值,谁小谁移动*  4、当指针遍历到某一节点时,因为是谁小谁移动,所以另一个指针的值一定是比当前指针的值大的,也就是说另一侧更高。*  5、因此可以计算当前指针能装的水量:ans += pre_max - height[left] 或 ans += suf_max - height[right]* *  时间复杂度O(n),空间复杂度O(1)*  注意:如果数组长度小于3,则无法形成容器,直接返回0* */public static int trap2(int[] height) {int ans = 0;int len = height.length;int left = 0,pre_max = 0;int right = len-1,suf_max = 0;while(left<=right){pre_max = Math.max(pre_max,height[left]);suf_max = Math.max(suf_max,height[right]);if(pre_max<suf_max){ans += pre_max-height[left];left++;}else {ans += suf_max-height[right];right--;}}return ans;}

http://www.lryc.cn/news/595448.html

相关文章:

  • 复制docker根目录遇到的权限问题
  • 模拟高负载测试脚本
  • 闲庭信步使用图像验证平台加速FPGA的开发:第二十八课——图像膨胀的FPGA实现
  • 关于Ajax的学习笔记
  • Linux的相关指令
  • 「日拱一码」034 机器学习——插值处理
  • Unity 脚本生命周期详解与实战分析
  • (十九)深入了解 AVFoundation-编辑:使用 AVMutableVideoComposition 实现视频加水印与图层合成(上)——理论篇
  • iOS 加固工具有哪些?快速发布团队的实战方案
  • RIQ模型时间管理方法详解
  • 工业自动化中的协议转换:RS485转PROFIBUS网关在涡街流量计与S7-300 PLC通信中的应用
  • Swap Face 使用遇到的问题
  • Match宣布2025曼谷发布会,发布“保本”资管新范式,旨在重塑Web3投资规则
  • 20250720问答课题-基于BERT与混合检索问答系统代码解读
  • 企业开发转型 | 前端AI化数字化自动化现状
  • 自动化商品监控:利用淘宝API开发实时价格库存采集接口
  • 【unitrix】 6.11 二进制数字标准化模块(normalize.rs)
  • G7打卡——Semi-Supervised GAN
  • Acrobat JavaScript 中的 `app.response()` 方法
  • 【学习路线】C#企业级开发之路:从基础语法到云原生应用
  • 基于MySQL实现分布式调度系统的选举算法
  • 一文速通《矩阵的特征值和特征向量》
  • Tomcat的部署、单体架构、session会话、spring
  • PostgreSQL高可用架构Repmgr部署流程
  • 计算机网络中:传输层和网络层之间是如何配合的
  • socket编程(UDP)
  • vue2使用v-viewer图片预览:打开页面自动预览,禁止关闭预览,解决在微信浏览器的页面点击事件老是触发预览初始化的问题
  • Linux 721 创建实现镜像的逻辑卷
  • 网络数据分层封装与解封过程的详细说明
  • 讯飞输入法3.0.1742功能简介