LeetCode ! 42 Trapping Rain Water

news2024/12/22 23:12:18

参考资料:leetCode评论区大佬, 《程序员代码面试指南》

思路1:使用单调栈

维持一个从栈底到栈顶中的元素——下标,对应到数组是从大到小排序。
遍历数组,如果新值大于栈顶元素(下标)对应的数组值,那么弹出栈顶,并为栈顶元素计算这次弹出位置所在小范围[l,r]的存水量(注意:并不是这个弹出位置(总共)能够存的水量,以下图中index=5处为例,弹出位置5 所在小范围的存水量是1,但位置5总共能够存的水量是2)
在这里插入图片描述
当弹出位置为4时,我们计算的 其所在小范围的存水量是 3,即下面标黄的部分。
在这里插入图片描述

(假设位置cur被弹出,它原来在栈中压的位置是l (也就是在自己左边、离自己最近、比自己大的),促使它弹出的位置是r(也就是在自己左边、离自己最近、比自己大的))
( M i n ( n u m s [ l ] , n u m s [ r ] ) − n u m s [ c u r ] ) × ( r − l − 1 ) (Min(nums[l],nums[r])-nums[cur])\times (r-l-1) (Min(nums[l],nums[r])nums[cur])×(rl1)

 public int trap(int[] height) {
        int n = height.length;
        Stack<Integer> stack = new Stack<>();
        int sum=0;
        for(int i=0;i<n;i++){

            while(!stack.isEmpty() && height[stack.peek()]<=height[i]){
                int cur = stack.pop();
                if( !stack.isEmpty())
                {
                    sum += Math.max(height[i],height[stack.peek()])-height[cur];
                }
            }

思路2:使用辅助空间记录前缀最大值,后缀最大值

对于位置i来说,找其左侧的最大值l,其右侧的最大值r, 所以,位置i所能存的总水量就是 M a x ( 0 , M i n ( l , r ) − n u m s [ i ] ) Max(0,Min(l,r)-nums[i]) Max(0,Min(l,r)nums[i]) 。注:最外层取max是防止出现 负的水量。
具体地,使用一个变量不断更新后缀最大值,这样避免申请新的辅助空间。

 public int trap(int[] height) {
          // help[i] = [...i].max , 这个最高值可能并不是 离自己最近的 , 所以我们计算的是位置i总共能够存多少水, 注意是“总共”,而不是“所在小范围”
          int n = height.length;
          int[] help = new int[n];
          help[0]=height[0];
          for(int i=1;i<n;i++){
              help[i] = help[i-1]>height[i]?help[i-1]:height[i];
          }
            int max=height[n-1],idx=n-1;
            int sum=0;
          for(int i=n-2;i>=1;i--){
              sum += Math.max(0,Math.min(help[i-1],max)-height[i]);
              max = Math.max(max,height[i]);
          }
        return sum;
      }

思路3:双指针

思路:
左指针l从1位置开始,右指针r从n-2位置开始,
maxL = nums[…l-1].max;
maxR = nums[r+1…].max;
每次比较maxL和 maxR,选小的,比如maxL, 那么结算位置l它自己的总水量,即
M a x ( m a x L − n u m s [ l ] , 0 ) Max(maxL-nums[l],0) Max(maxLnums[l],0),加入到sum中;然后更新maxL, l++.
原理是:接上,对于nums[l]来说,它的存水高度的短板已经出现了,也就是maxL.那么位置l的存水量也就可以确定了。

public int trap(int[] height) {
          if(height==null||height.length<3){return 0;}
          int maxL=height[0],maxR=height[height.length-1]; // 
          int l=1, r=height.length-2;
          int sum=0;
          while(l<=r){
              if(maxL<=maxR){

                  sum+=Math.max(maxL-height[l],0);
                  maxL = Math.max(maxL,height[l]);
                  l++;
                
              }else{
                  sum+=Math.max(maxR-height[r],0);
                  maxR=Math.max(maxR,height[r]);
                  r--;
              }

          }

        return sum;
      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/624081.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『Linux』第九讲:Linux多线程详解(六 - 完结)_ 线程池 | 读写锁

「前言」文章是关于Linux多线程方面的知识&#xff0c;上一篇是 Linux多线程详解&#xff08;五&#xff09;&#xff0c;今天这篇是 Linux多线程详解&#xff08;六&#xff09;&#xff0c;也是多线程最后一篇&#xff0c;内容大致是线程池&#xff0c;讲解下面开始&#xff…

什么?英语不好?这所211可以不考英语!

本期为大家整理热门院校“哈尔滨工程大学810”的择校分析&#xff0c;这个择校分析专题会为大家结合&#xff1a;初试复试占比、复试录取规则&#xff08;是否公平&#xff09;、往年录取录取名单、招生人数、分数线、专业课难度等进行分析。希望能够帮到大家! –所有数据来源…

KDJJC-80绝缘油介电强度测试仪

一、概述 测试仪&#xff08;单杯&#xff09;是我公司科研技术人员&#xff0c;依据国家标准GB507-1986及行标DL/T846.7-2004的有关规定&#xff0c;发挥自身优势&#xff0c;经过多次现场试验和长期不懈努力&#xff0c;精心研制开发的高准确度、数字化工业仪器。 为满足不同…

初步了解SpringCloud微服务架构

✅作者简介&#xff1a;大家好&#xff0c;我是Cisyam&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Cisyam-Shark的博客 &#x1f49e;当前专栏&#xff1a; 微服务探索之旅 ✨特色专…

Apikit SaaS 10.9.0 版本更新:接口测试支持通过 URL 请求大型文件,覆盖更多场景的文件请求测试

Hi&#xff0c;大家好&#xff01; Eolink Apikit 即将在 2023年 6月 8日晚 18:00 开始更新 10.9.0 版本。本次版本更新主要是对多个应用级资源合并&#xff0c;并基于此简化付费套餐和降低费率。 本次应用合并是为了接下来更好的发挥 Eolink Apikit 的优势&#xff0c;提供 …

Web前端-React学习

React基础 React 概述 React 是一个用于构建用户界面的JavaScript库。 用户界面&#xff1a; HTML页面&#xff08;前端&#xff09; React主要用来写HTML页面&#xff0c; 或构建Web应用 如果从MVC的角度来看&#xff0c;React仅仅是视图层&#xff08;V&#xff09;,也就…

多目标建模loss为什么最好同时收敛?

多目标的多个loss是否同时收敛最好&#xff1f; 假设 task A的独有参数 W a W_a Wa​task B的独有参数 W b W_b Wb​task A和 task B的共享的参数 W s W_s Ws​ 那么 l o s s l o s s a l o s s b loss loss_a loss_b losslossa​lossb​ 假设损失函数为 f f f&…

【DepthFilter】深度滤波器

14讲P326-327 函数实现一个深度滤波器&#xff0c;用于计算图像中某个像素点的深度值。算法步骤的含义和含义&#xff1a; 将当前帧的像素点和参考帧的像素点通过三角化计算深度。将参考帧到当前帧的变换矩阵 T_C_R 转换为当前帧到参考帧的变换矩阵 T_R_C。将参考帧像素点 pt_…

Docker超详细基础使用(带图)

目录 安装ubuntu 基本使用命令 docker run 容器名 延伸命令 启动ubuntu 查看所有正在运行的容器 指定容器别名启动 doker ps 延伸命令 退出容器 重新进入正在运行的容器 启动容器 删除已停止的容器 强制删除容器 查看容器日志 查看容器内部运行的进程 ​编辑 查看容…

Axure教程—分段滑动条

本文将教大家如何用AXURE中动态面板制作单分段滑动条 一、效果 预览地址&#xff1a;https://c00qrq.axshare.com 下载地址&#xff1a;https://download.csdn.net/download/weixin_43516258/87881401?spm1001.2014.3001.5503 二、功能 滑块滑动到相应的浮点&#xff0c;显示…

【SVN】SVN查看日志时报错:联系服务器时出现问题,条目不可读

目录 0.背景介绍 1.问题原因 2.解决步骤 0.背景介绍 环境&#xff1a;SVN服务器在ubuntu下&#xff0c;SVN客户端在windows下。 最近在搭ubuntu下的SVN的服务器&#xff0c;然后再windows下用SVN客户端将文件上传至服务器保管。 windows下想查看日志时&#xff0c;报错【…

React学习7 redux

redux的三个核心概念 1. action 动作的对象包含2个属性 type&#xff1a;标识属性, 值为字符串, 唯一, 必要属性data&#xff1a;数据属性, 值类型任意, 可选属性例子&#xff1a;{ type: ADD_STUDENT,data:{name: tom,age:18} } 2. reducer 用于初始化状态、加工状态。加工…

健身器材开发方案,带有12位ADC检测、LED屏显的语音IC-N9300

身体锻炼过程中所使用到的所有物品&#xff0c;健身器材类体育用品则主要涉及健身领域&#xff0c;包括室外健身器材和室内健身器材。 每天清晨或傍晚跑跑步&#xff0c;不仅能提高身体素质同时能得到很好的瘦身效果。然而大部分人觉得慢跑等运动过于无聊没有给予运动者本身进行…

【Redis编译安装】---redis-4.0.8

【Redis编译安装】---redis-4.0.8 &#x1f53b; 一、Redis 编译安装1.1 ⛳ 上传解压1.2 ⛳ 升级gcc环境1.3 ⛳ 编译安装1.3.1 &#x1f341;cd 到redis解压目录1.3.2 &#x1f341;编译1.3.3 &#x1f341; make test1.3.4 &#x1f341; 安装tcl-8.51.3.5 &#x1f341; 安装…

shell 第十一章

1.写一个库函数&#xff0c;用定时任务调用这个库函数&#xff0c;每月1号执行 1.sh: 1.1.sh: 2.以免交互的方式实现 ssh 远程登录&#xff0c;密码错误也直接退出&#xff0c;不用人干预 3.以免交互的方式&#xff0c;实现磁盘分区、格式化、挂载

Keysight 34970A数据采集记录仪产品介绍

Keysight 34970A数据采集记录仪 Keysight 34970A数据采集记录仪开关单元由一个 3 插槽主机和一个内置的 6 1/2 位数字万用表组成。每个通道可以单独配置&#xff0c;以测量 11 种不同功能之一&#xff0c;这样既不会增加成本&#xff0c;也不必使用复杂的信号调理附件。您可用…

【干货】PCB材料选择与性能比较

PCB板被广泛应用于电子行业&#xff0c;作为电子设备的重要组成部分之一&#xff0c;负责连接各种电子元件。PCB板的性能直接影响着电子设备的质量和稳定性。而PCB板的材料选择则是影响PCB板性能的关键因素之一。本文将对常见PCB材料进行比较分析&#xff0c;以便于选择适合的材…

直线模组的应用案例

直线模组最早是在德国开发使用的&#xff0c;因其具有单体运动速度快、重复定位精度高、本体质量轻、占设备空间小、寿命长等特点&#xff0c;被广泛应用在各种各样的机械设备中&#xff0c;尤其是自动化领域&#xff0c;基本上都能看到直线模组的身影&#xff0c;那么&#xf…

Target DVS EDI项目开源介绍

近期为了帮助广大用户更好地使用 EDI 系统&#xff0c;我们根据以往的项目实施经验&#xff0c;将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后&#xff0c;只需要下载我们整理好的示例代码&#xff0c;并放置在知行之桥指定的工作区中&#xff0c;即可开始使用。 …

小程序项目结构与组件基础

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/front-end-tutorial 】或者公众号【AIShareLab】回复 小程序 也可获取。 文章目录 项目结构了解项目的基本组成结构小程序页面的组成部分json配置文件的作用全局配置文件app.jsonproject.config.jso…