leetcode算法题之接雨水

news2024/9/22 15:43:01

这是一道很经典的题目,问题如下:

题目地址

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

解法1:动态规划

动态规划的核心就是将问题拆分成若干个子问题求解,那这道题的问题实际上可以拆分为求x轴上每一块区域能承载多少雨水,而x轴上每一块区域能承载多少雨水取决于它左边和右边的最大高度值以及它的自身高度,所以我们可以先维护两个数组leftMaxArr和rightMaxArr

// height是leetcode传进来的高度数组

leftMaxArr[i] = Math.max(leftMaxArr[i - 1], height)
rightMaxArr[i] = Math.min(rightMaxArr[i + 1], height)

leftMaxArr每一项对应着从左到当前区域高度的最大值,rightMaxArr就是从右到当前区域

知道了x轴上每一块区域的左右高度最大值后那这个子问题就很简单了,我们先定义一个子问题的结果数组result,那么公式可以这么写

result[i] = Math.max(leftMaxArr, rightMaxArr) - height[i]

最后将这个result数组的值加起来,就是本道题的结果了,当然,我们不需要使用到result数组,用一个变量维护即可,代码如下

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
  const len = height.length
  const leftMaxArr = [], rightMaxArr = []

  let result = 0

  leftMaxArr[0] = height[0]
  rightMaxArr[len - 1] = height[len - 1]

  for (let i = 1; i < len - 1; i++) {
    leftMaxArr[i] = Math.max(leftMaxArr[i - 1], height[i])
  }
  for (let i = len - 2; i > 0; i--) {
    rightMaxArr[i] = Math.max(rightMaxArr[i + 1], height[i])
  }

  // 忽略 0 和 len - 1,因为它们是边界,不会有雨水
  for (let i = 1; i < len - 1; i++) {
    result += Math.min(leftMaxArr[i], rightMaxArr[i]) - height[i]
  }

  return result
};

解法2:双指针

这个解法是由解法一衍生而来,由解法一发现我们不需要同时知道左右的最大高度,只需要知道高度比较小的一侧,所以我们可以定义两个指针往中间收缩,每一次收缩的位置即为高度较小的一侧,这样就不用维护两个数组了,空间复杂度为O(1),代码如下:

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
  const len = height.length

  let leftMax = height[0], rightMax = height[len - 1]
  let result = 0

  let left = 0, right = len - 1

  while (left < right) {
    // 此时leftMax一定小于rightMax,好比打擂台,强大的人可以一直打下去~
    if (height[left] < height[right]) {
      // 左侧为高度较小的一侧,对左指针当前位置用左侧最大高度进行计算
      result += leftMax - height[left]
      left++
      // 更新左侧最大高度
      leftMax = Math.max(leftMax, height[left])
    } else {
      result += rightMax - height[right]
      right--
      rightMax = Math.max(rightMax, height[right])
    }
  }

  return result
}

这样这个问题就完美解决啦,leetcode还有一种关于单调栈的解法,有兴趣的可以了解下~

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

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

相关文章

相信开源的力量,MoonBit 构建系统正式开源

MoonBit 构建系统正式开源 作为由 AI 驱动的云服务和边缘计算开发者平台&#xff0c;MoonBit 自设计之初便注重工具链与语言的协同效果。MoonBit 为开发者提供了一套开箱即用的工具链&#xff0c;包括集成开发环境&#xff08;IDE&#xff09;、编译器、构建系统和包管理器&…

内网隧道——HTTP隧道

文章目录 一、ReGeorg二、Neo-reGeorg三、Pivotnacci 实验网络拓扑如下&#xff1a; 攻击机kali IP&#xff1a;192.168.111.0 跳板机win7 IP&#xff1a;192.168.111.128&#xff0c;192.168.52.143 靶机win server 2008 IP&#xff1a;192.168.52.138 攻击机与Web服务器彼此之…

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示

Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 目录 Unity 之 【Android Unity 共享纹理】之 Android 共享图片给 Unity 显示 一、简单介绍 二、共享纹理 1、共享纹理的原理 2、共享纹理涉及到的关键知识点 3、什么可以实现共享 不能实现共享…

越权与逻辑漏洞

目录 越权漏洞 1、越权原理概述 2、越权分类 2.1、平行越权 2.2、垂直越权 3、越权防范&#xff1a; 逻辑漏洞 1、常见的逻辑漏洞 2、逻辑漏洞概述 3、逻辑漏洞防范&#xff1a; 越权漏洞 1、越权原理概述 如果使用A用户的权限去操作B用户的数据&#xff0c;A的权限…

静态路由技术

一、路由的概念 路由是指指导IP报文发送的路径信息。 二、路由表的结构 1、Destination/Mask:IP报文的接收方的IP地址及其子网掩码; 2、proto:协议(Static:静态路由协议,Direct:表示直连路由) 3、pref:优先级(数值和优先级成反比) 4、cost:路由开销(从源到目的…

jQuery下落撞击散乱动画

jQuery下落撞击散乱动画https://www.bootstrapmb.com/item/14767 在jQuery中实现一个下落撞击后散乱的动画效果&#xff0c;你可以结合CSS动画和jQuery的动画函数来完成。不过&#xff0c;由于jQuery本身并不直接支持复杂的物理效果&#xff08;如撞击后的散乱&#xff09;&a…

Nessus-M 暴力破解Nessus漏扫后台登录工具

项目地址:https://github.com/MartinxMax/Nessus-M Nessus-M Nessus漏洞扫描程序登录界面的暴力破解工具 帮助信息 $ python3 nessus-m.py -h 暴力破解 $ python3 nessus-m.py 192.168.101.156 8834 username.txt /usr/share/wordlists/rockyou.txt --protocol https

贪心系列专题篇二

增减字符串匹配 题目 思路 贪心策略&#xff1a;对于[0,n]&#xff0c;当遇到“I”时&#xff0c;把所剩的数中最小的拿来使用&#xff1b; 当遇到“D”时&#xff0c;把所剩的数中最大的拿来使用&#xff0c;最后还剩一个数&#xff0c;放末尾。 代码 class Solution { pu…

sbti科学碳目标倡议是什么

在科学界、工业界以及全球政策制定者的共同努力下&#xff0c;一个名为“科学碳目标倡议”&#xff08;Science Based Targets initiative&#xff0c;简称SBTi&#xff09;的全球性合作平台应运而生。这一倡议旨在推动企业和组织设定符合气候科学要求的减排目标&#xff0c;以…

Nginx 如何处理请求的限速?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; 文章目录 Nginx 如何处理请求的限速一、为什么需要对请求进行限速&#xff08;一&#xff09;服务器过载&#xff08;二&#xff09;资源竞争&#xff08;三&#xff09;服…

数据接入开放协议-GRPC接入

协议定义 一、接入认证 message VerifyRequest { string authToken 1; // 接入管理分配的UUID string endpointName 2; // 定义的接入设备名 string endpointIdentify 3; // 接入设备的ID int64 leaseValue 4; // 租约时间,接入侧申明数据上送间隔最大时间&…

JWT令牌在项目中的实战操作

一.什么是JWT令牌&#xff1f; JWT&#xff0c;全称JSON Web Token&#xff0c;官网&#xff08;https://jwt.io/&#xff09;&#xff0c;定义了一种间接的&#xff0c;自包含的格式&#xff0c;用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在&#xff0c;…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 卡牌游戏(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

哪些工具能分析反向链接?

这里推荐两个工具&#xff0c;Ahrefs以及SEMrush&#xff0c;Ahrefs 是一个全面的SEO工具&#xff0c;特别擅长反向链接分析。它可以显示谁在链接到你的网站&#xff0c;以及这些链接的质量和数量。Ahrefs 提供详细的报告&#xff0c;包括每个反向链接的锚文本、来源网站的权重…

内部函数和外部函数(例子为C语言)

​​​​ 怎么来的&#xff1f; 函数本质上是全局的&#xff0c;因为定义一个函数的目的就是这个函数与其他函数之间相互调用&#xff0c;如果不声明的话&#xff0c;一个函数既可以被本文件中的其他函数调用&#xff0c;也可以被其他文件中的函数调用。但是可以指定某些函数…

php 存储复杂的json格式查询(如:经纬度)

在开发中&#xff0c;有时我们可能存了一些复杂json格式不知道怎么查。我这里提供给大家参考下&#xff1a; 一、先上表数据格式&#xff08;location字段的possiton经纬度以逗号分开的&#xff09; {"title":"澳海文澜府","position":"11…

JSON 文件存储

JSON 全称为&#xff1a; JavaScript Object Notation 也就是 javaScript 对象标记&#xff0c;通过对象和数组的组合来表示数据&#xff0c; 虽然构造简洁&#xff0c;但是结构化程度非常高&#xff0c; 是一种轻量级的数据交换格式 对象和数组 在 JavaScript 语言中&#…

MAT使用

概念 Shallow heap & Retained Heap Shallow Heap就是对象本身占用内存的大小。 Retained Heap就是当前对象被GC后&#xff0c;从Heap上总共能释放掉的内存(表示如果一个对象被释放掉&#xff0c;那会因为该对象的释放而减少引用进而被释放的所有的对象&#xff08;包括…

用Docker来辅助开发

现在好像用Docker是越来越多了。之前其实也看过docker的原理&#xff0c;大概就是cgroup那些&#xff0c;不过现在就不看原理了&#xff0c;不谈理论&#xff0c;只看实际中怎么用&#xff0c;解决眼前问题。 用docker来做开发&#xff0c;其实就是解决的编译环境的差异&#…

解决kkfileview 使用https预览问题记录

场景&#xff1a;项目使用了开源的kkfileview进行文件在线预览&#xff0c;部署方式使用的是docker&#xff0c;使用IP进行访问&#xff0c;但是http协议直接访问有漏洞告警&#xff0c;现在需要调整为https&#xff0c;且仍然需要使用IP访问。 kkfileview官网kkFileView - 在线…