leetcode-动态规划-42-接雨水

news/2024/6/16 14:26:52 标签: leetcode, 动态规划, 算法

题目

给定 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.length
        if (n == 0) return 0
        
        var left = 0
        var right = n - 1
        var leftMax = 0
        var rightMax = 0
        var trappedWater = 0
        
        while (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))  // 输出 6

        val height2 = Array(4, 2, 0, 3, 2, 5)
        println(trap(height2))  // 输出 9
    }
}

http://www.niftyadmin.cn/n/4954114.html

相关文章

实现多线程的4种方式

实现多线程的4种方式 使用实现多线程有四种方式&#xff1a; 继承 Thread 类&#xff1b; 实现 Runnable 接口&#xff1b; 使用 Callable 和 FutureTask 实现有返回值的多线程&#xff1b; 使用 ExecutorService 和 Executors 工具类实现线程池(如果需要线程的返回值&…

人工智能原理(6)

目录 一、机器学习概述 1、学习和机器学习 2、学习系统 3、机器学习发展简史 4、机器学习分类 二、归纳学习 1、归纳学习的基本概念 2、变型空间学习 3、归纳偏置 三、决策树 1、决策树组成 2、决策树的构造算法CLS 3、ID3 4、决策树的偏置 四、基于实例的学习…

在线SHA512加密工具--在线获取哈希值又称摘要

具体请前往&#xff1a;在线计算Sha512摘要工具

aardio简单数据表修改实例

import win.ui; import console; /*DSG{{*/ var winform win.form(text"aardio form";right759;bottom469) winform.add( listview{cls"listview";left120;top80;right616;bottom368;edge1;z1} ) /*}}*/ //简单数据表修改实例 import win.ui.grid win.ui.…

STM32F4X USART串口使用

STM32F4X USART串口使用 串口概念起始位波特率数据位停止位校验位串口间接线 STM32F4串口使用步骤GPIO引脚复用函数串口初始化函数串口例程 串口概念 串口是MCU与外部通信的重要通信接口&#xff0c;也是MCU在开发过程中的调试利器。串口通信有几个重要的参数&#xff0c;分别…

13 MySQL

文章目录 MySQL基本使用安装RDBMS使用Navicat新建数据库新建查询--即代码运行的地方运行代码表的操作 命令行连接数据完整性数据类型约束 SQL的基础语法特性&#xff1a;SQL语句的分类DDL库管理 DDL表管理&#xff1a;DML(增删改)新增删除更新 DQL(查)DQL基础查询as 取别名消除…

后端开发13.商品搜索模块

概述 简介 商品搜索引擎采用的是elasticsearch 数据库设计 创建商品索引 PUT /goods {"settings": {"number_of_shards": 5,"number_of_replicas": 1,"analysis": {"analyzer": {"ik_pinyin": {"tokeni…

JavaScript中的作用域(scope)是什么?以及有哪些类型的作用域?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 作用域&#xff08;Scope&#xff09;是什么&#xff1f;1. 全局作用域&#xff08;Global Scope&#xff09;2. 局部作用域&#xff08;Local Scope&#xff09;3. 块级作用域&#xff08;Block Scope&#xff09; ⭐ 写在最后 ⭐ 专栏简…