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

leetcode-动态规划-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

提示:

n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105

思路

这个问题可以使用双指针和动态规划的方法来解决,以下是使用双指针的解题思路:

  1. 我们可以通过遍历一遍数组来找出每个位置的左边最大高度和右边最大高度。

  2. 创建两个数组,left_maxright_max,分别记录每个位置左边和右边的最大高度。

  3. 对于left_max数组,从左到右遍历数组,left_max[i]表示位置i左边的最大高度。

  4. 对于right_max数组,从右到左遍历数组,right_max[i]表示位置i右边的最大高度。

  5. 接下来,再次遍历数组,对于每个位置,计算其能接到的雨水量。雨水量可以通过取左右最大高度的较小值,减去当前位置的高度,来计算。

  6. 将每个位置的雨水量相加,就得到了总的雨水量。

这种解决方案的时间复杂度是O(n),其中n是数组的长度。

代码

object Solution {def trap(height: Array[Int]): Int = {val n = height.lengthif (n == 0) return 0var left = 0var right = n - 1var leftMax = 0var rightMax = 0var trappedWater = 0while (left < right) {if (height(left) < height(right)) {if (height(left) > leftMax) {leftMax = height(left)} else {trappedWater += leftMax - height(left)}left += 1} else {if (height(right) > rightMax) {rightMax = height(right)} else {trappedWater += rightMax - height(right)}right -= 1}}trappedWater}def main(args: Array[String]): Unit = {val height1 = Array(0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1)println(trap(height1))  // 输出 6val height2 = Array(4, 2, 0, 3, 2, 5)println(trap(height2))  // 输出 9}
}
http://www.lryc.cn/news/131419.html

相关文章:

  • [静态时序分析简明教程(十一)]浅议tcl语言
  • 大数据-玩转数据-Flink 网站UV统计
  • 3分钟了解下cwnd和TCP拥塞控制算法
  • 设计模式之状态模式(State)的C++实现
  • 无涯教程-TensorFlow - Keras
  • 使用SSH隧道将Ubuntu云服务器Jupyter Notebook端口映射到本地
  • Keepalived+LVS部署高可用集群
  • 2023河南萌新联赛第(五)场:郑州轻工业大学
  • 在Orangepi5开发板3588s使用opencv获取摄像头画面
  • 音视频 ffmpeg命令分类查询
  • VSCode无法从Extensions下载工具时,把工具下载到本地并添加到VSCode编辑器
  • WebStrom 前端项目Debug
  • 【ARM Linux 系统稳定性分析入门及渐进12 -- GDB内存查看命令 “x“(examine)】
  • kube-prometheus 系列1 项目介绍
  • 深度学习在组织病理学图像分析中的应用: Python实现和代码解析
  • kotlin的列表
  • PCL 三维点云边界提取(C++详细过程版)
  • ../../ 目录遍历
  • clickhouse集群部署
  • centos8 使用phpstudy安装tomcat部署web项目
  • 爬虫百度返回“百度安全验证”终极解决方案
  • visual studio 2022配置
  • B-树和B+树的区别
  • c注册cpp回调函数
  • 批量将excel中字段为“八百”替换成“九百”
  • 关于docker-compose up -d在文件下无法运行的原因以及解决方法
  • 机器学习笔记 - 基于keras + 小型Xception网络进行图像分类
  • 【Unity每日一记】SceneManager场景资源动态加载
  • 自动驾驶数据回传需求
  • 使用Jmeter自带recorder代理服务器录制接口脚本