【LeetCode】接雨水 II [H](堆)

news2025/1/18 14:45:28

407. 接雨水 II - 力扣(LeetCode)

一、题目

给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。

示例 1:

输入: heightMap = [[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]
输出: 4
解释: 下雨后,雨水将会被上图蓝色的方块中。总的接雨水量为1+2+1=4。 

示例 2:

输入: heightMap = [[3,3,3,3,3],[3,2,2,2,3],[3,2,1,2,3],[3,2,2,2,3],[3,3,3,3,3]]
输出: 10 

提示:

  • m == heightMap.length
  • n == heightMap[i].length
  • 1 <= m, n <= 200
  • 0 <= heightMap[i][j] <= 2 * 104

二、代码

class Solution {
    class Node {
        // 坐标
        public int x;
        public int y;
        // 该位置的的高度
        public int value;

        public Node(int x, int y, int value) {
            this.x = x;
            this.y = y;
            this.value = value;
        }
    }

    public int trapRainWater(int[][] heightMap) {
        // 小根堆
        PriorityQueue<Node> heap = new PriorityQueue<>((a, b) -> a.value - b.value);
        // 矩阵的行数
        int n = heightMap.length;
        // 矩阵的列数
        int m = heightMap[0].length;
        // 内弧的瓶颈
        int max = 0;
        // 标志当前位置是否已经加入到过小根堆,true表示已经加入过小根堆
        boolean[][] isVisited = new boolean[n][m];
        // 先将矩阵的四周的都加入到堆中,四周一定是存不下水的
        for (int i = 0; i < m; i++) {
            heap.add(new Node(0, i, heightMap[0][i]));
            isVisited[0][i] = true;
        }
        for (int i = 1; i < n; i++) {
            heap.add(new Node(i, m - 1, heightMap[i][m - 1]));
            isVisited[i][m - 1] = true;
        }
        for (int i = m - 2; i >= 0; i--) {
            heap.add(new Node(n - 1, i, heightMap[n - 1][i]));
            isVisited[n - 1][i] = true;
        }
        for (int i = n - 2; i >= 1; i--) {
            heap.add(new Node(i, 0, heightMap[i][0]));
            isVisited[i][0] = true;
        }

        // 记录总的水量
        int water = 0;
        while (!heap.isEmpty()) {
            // 将堆顶弹出
            Node cur = heap.poll();
            int row = cur.x;
            int col = cur.y;
            // 用堆顶尝试更新瓶颈Max
            max = Math.max(max, cur.value);

            // 将弹出位置的上、下、左、右还没有加入过堆的位置加入到堆中,同时结算加入堆的位置的水量
            if (row > 0 && !isVisited[row - 1][col]) {
                heap.add(new Node(row - 1, col, heightMap[row - 1][col]));
                isVisited[row - 1][col] = true;
                water += (Math.max(0, max - heightMap[row - 1][col]));
            }

            if (row < n - 1 && !isVisited[row + 1][col]) {
                heap.add(new Node(row + 1, col, heightMap[row + 1][col]));
                isVisited[row + 1][col] = true;
                water += (Math.max(0, max - heightMap[row + 1][col]));
            }

            if (col > 0 && !isVisited[row][col - 1]) {
                heap.add(new Node(row, col - 1, heightMap[row][col - 1]));
                isVisited[row][col - 1] = true;
                water += (Math.max(0, max - heightMap[row][col - 1]));
            }

            if (col < m - 1 && !isVisited[row][col + 1]) {
                heap.add(new Node(row, col + 1, heightMap[row][col + 1]));
                isVisited[row][col + 1] = true;
                water += (Math.max(0, max - heightMap[row][col + 1]));
            }

        }

        // 返回总水量
        return water;
    }
}

三、解题思路 

整个流程就还是按照求瓶颈的思想来结算水量,具体的流程在代码注释中。

用堆的作用就是保证从小到大开始处理,这样能将max内弧中的数全都结算完水量(该内弧中所有小于max的数),再去更新更大的max,去结算新的内弧水量,避免数据遗漏。

如果此时小根堆里最小值都超过max了,那么说明此时小根堆里的所有值都超过max了,也就是此时已经来到了一个全新的内弧了,不再是以前那个max作为瓶颈的内弧了,现在遍历来到了一个全新的内弧。

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

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

相关文章

Wireshark TS | 三谈 TCP 握手异常问题

前言 继续以一个实际案例来说下 TCP 握手问题&#xff0c;该数据包仍然来自于 Wireshark sharkfest 2017&#xff0c;一些简短但有趣的 TCP 跟踪文件中的又一个&#xff0c;或者说是最后一个了。可以说这些都是和 TCP 握手相关的连接问题&#xff0c;有兴趣的朋友可以私信&…

Mybatis-Plus开发提速器mybatis-plus-generator-ui

前言 在基于Mybatis的开发模式中&#xff0c;很多开发者还会选择Mybatis-Plus来辅助功能开发&#xff0c;以此提高开发的效率。虽然Mybatis也有代码生成的工具&#xff0c;但Mybatis-Plus由于在Mybatis基础上做了一些调整&#xff0c;因此&#xff0c;常规的生成工具生成的代码…

【一文秒懂——SLF4j日志】

目录 1. SLF4j日志 2. 日志输出 1. SLF4j日志 在添加了spring-boot-starter的项目中&#xff0c;已经包含了SLF4j日志的相关依赖项。 在添加了lombok的项目中&#xff0c;可以在类上添加Slf4j注解&#xff0c;则lombok框架会在编译期在类中声明名为log的变量&#xff0c;通…

农民歌唱家大衣哥喜迎贵客,这三位明星一般人还真请不动

都知道农民歌唱家大衣哥家里热闹&#xff0c;不过大部分都是蹭流量拍视频的&#xff0c;真正的好朋友绝对没有几个。虽然说没有几个好朋友&#xff0c;但是也不代表一个没有&#xff0c;看看在大衣哥家里吃饭的三位&#xff0c;每一个都不是一般人物。 如今的大衣哥&#xff0c…

发现智能合约中的 bug 的 7 个方法

寻找智能合约bug可能是一项高回报的工作&#xff0c;而且它也保护了生态系统免受黑客攻击。我最近有幸采访了一位开发人员&#xff0c;他发现了一个价值 70 亿美元的错误&#xff0c;并因报告该错误而获得了 220 万美元的报酬。 在这篇文章中&#xff0c;我将详细介绍该开发人…

路由和流量控制

路由策略 控制路由,从而影响IP包的转发路径。 路由策略的主要功能有两个,1)过滤路由信息,2)修改路由属性值。 路由匹配工具 acl 只有基本acl(Basic ACL,编号为 2000-2999)可以匹配路由。ACL匹配路由时只能匹配路由的网络号,但无法匹配掩码长度。 [RouterA] acl n…

基于SpringBoot的会员制医疗预约服务管理信息系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;Vue、HTML 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#…

使用CSS实现多种Noise噪点效果

在插画中添加噪点肌理可以营造出一种自然的氛围。噪点肌理可以用于塑造阴影、高光、深度以及更多细节&#xff0c;并优化插画质感&#xff0c;应用噪点肌理的方式在扁平插画中广受欢迎。 在前端开发过程中&#xff0c;我们也有可能遇到噪点插画风格的设计稿&#xff0c;应用基…

实验三-----数据库

一、实验目的 1.掌握SQL Server Management Studio中SQL 查询操作&#xff1b; 2.掌握SQL 的单表查询命令&#xff1b; 3.掌握SQL 的连接查询操作&#xff1b; 4.掌握SQL 的嵌套查询操作&#xff1b; 5.掌握SQL 的集合查询操作。 二、实验环境 1&#xff0e;实验室名称&…

Nevron 3DChart创建有吸引力的3D和2D图表

Nevron 3DChart创建有吸引力的3D和2D图表 3DChart使用OpenGL 3D图形引擎创建复杂的2D和3D图表和图形,这些图表和图形可以包含静止或动画图像。3DChart包括用于生成图表模板的独立应用程序和ASP服务器配置实用程序。该组件还包括一个专门设计用于与3DChart集成的工具栏组件。用…

SignalR简介及实践指南

SigalR简介 ASP.NET Core SignalR 是一个开放源代码库&#xff0c;可用于简化向应用添加实时 Web 功能。 实时 Web 功能使服务器端代码能够将内容推送到客户端。 适合 SignalR 的候选项&#xff1a; 需要从服务器进行高频率更新的应用。 示例包括游戏、社交网络、投票、拍卖…

【LeetCode】No.102. Binary Tree Level Order Traversal -- Java Version

题目链接&#xff1a;https://leetcode.com/problems/binary-tree-level-order-traversal/ 1. 题目介绍&#xff08;Binary Tree Level Order Traversal&#xff09; Given the root of a binary tree, return the level order traversal of its nodes’ values. (i.e., from …

React Redux 中触发异步副作用

React Redux 中触发异步副作用 一些基本的配置&#xff08;这里使用 toolkit&#xff09;可以在这篇笔记中找到&#xff1a;react-redux 使用小结&#xff0c;这里不多赘述。 触发副作用主流的操作方式有两种&#xff1a; 组件内操作 适合只会在当前组件中触发的 API 操作 写…

企业数仓DQC数据质量管理实践篇

一.数据质量管理背景 以大数据平台的核心理念是构建于业务之上&#xff0c;用数据为业务创造价值。大数据平台、数据仓库的搭建之初&#xff0c;优先满足业务的使用需求&#xff0c;数据质量往往是被忽视的一环。但随着业务的逐渐稳定&#xff0c;数据质量越来越被人们所重视。…

2.1.3 运算放大器的参数以及选型、静态、交流技术指标

笔者电子信息专业硕士毕业&#xff0c;获得过多次电子设计大赛、大学生智能车、数学建模国奖&#xff0c;现就职于南京某半导体芯片公司&#xff0c;从事硬件研发&#xff0c;电路设计研究。对于学电子的小伙伴&#xff0c;深知入门的不易&#xff0c;特开次博客交流分享经验&a…

基于小脑模型神经网络轨迹跟踪matlab程序

1 CMAC概述 小脑模型神经网络(Cerebellar Model Articulation Controller,CMAC)是一种表达复杂非线性函数的表格查询型自适应神经网络&#xff0c;该网络可通过学习算法改变表格的内容&#xff0c;具有信息分类 存储的能力。 CMAC把系统的输入状态作为一个指针&#xff0c;把相…

Oracle-Autoupgrade方式升级19c

前言: Autoupgrade是Oracle 推出的自动升级工具&#xff0c;通过该工具可以将数据库升级为Oracle12.2之后的版本&#xff0c;工具支持升级前的检查、升级问题修复、一键式自动升级以及升级后的问题修复&#xff0c;极大的简化数据库的升级步骤。 支持的目标升级版本: Oracle D…

用 Java 实现爬虫 (爬取本地html中的人物信息并可视化人物关系)

目录 爬虫简介 常用的工具框架 selenium Jsoup Jsoup介绍 Jsoup的主要功能如下&#xff1a; HTML 相关知识 通过Jsoup元素获取 案例 爬取本地html中的角色信息 HtmlParseUtil 可以利用relation-graph 将人物关系可视化 使用爬虫要注意 查看网站的爬虫协议 爬虫简介…

面试:ANR原因及排查

ANR原因 1、CPU满负荷&#xff0c;I/O阻塞 2、内存不足&#xff0c;系统分配给一个应用的内存是有上限的&#xff0c;长期处于内存紧张&#xff0c;会导致频繁内存交换&#xff0c;进而导致应用的一些操作超时。自己内存泄漏或者其他应用占用的大量内存 3、四大组件ANR 4、…

字符串压缩(一)之ZSTD

一、zstd压缩与解压 ZSTD_compress属于ZSTD的Simple API范畴&#xff0c;只有压缩级别可以设置。 ZSTD_compress函数原型如下&#xff1a; size_t ZSTD_compress(void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel) ZSTD_decompress函数原…