leetcode 407. 接雨水 II

embedded/2025/1/19 13:23:50/

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

堆+bfs。

模拟水流出去的过程。先把边缘的单元都加到堆里,从堆顶最小的单元开始bfs,遍历到的单元的四周,都会从该单元流出去,四周的单元的剩余水量+高度=max(自己的高度,遍历到单元的水量)

struct Node {int x, y;int h;int w;bool v = false;Node(int x, int y, int h) {this->x = x;this->y = y;this->h = h;w = 30000;}
};
bool myComp(Node* a, Node* b) {return a->h < b->h;
}
class Solution {
public:int trapRainWater(vector<vector<int>>& heightMap) {int n = heightMap.size();int m = heightMap[0].size();vector<vector<Node*>> f;vector<Node*> heap;for (int i = 0; i < n; i++) {vector<Node*> t(m);for (int j = 0; j < m; j++) {t[j] = new Node(i, j, heightMap[i][j]);if (i == 0 || i == n - 1 || j == 0 || j == m - 1) {heap.push_back(t[j]);t[j]->w = t[j]->h;t[j]->v = true;}}f.push_back(t);}sort(heap.begin(), heap.end(), myComp);Node* node;Node* t;while (!heap.empty()) {node = heap[0];if (node->x > 0) {t = f[node->x - 1][node->y];if (!t->v) {t->v = true;t->w = max(t->h, node->w);heap.push_back(t);int idx = HeapUp(heap, heap.size() - 1);HeapDown(heap, idx);}}if (node->x < n - 1) {t = f[node->x + 1][node->y];if (!t->v) {t->v = true;t->w = max(t->h, node->w);heap.push_back(t);int idx = HeapUp(heap, heap.size() - 1);HeapDown(heap, idx);}}if (node->y > 0) {t = f[node->x][node->y - 1];if (!t->v) {t->v = true;t->w = max(t->h, node->w);heap.push_back(t);int idx = HeapUp(heap, heap.size() - 1);HeapDown(heap, idx);}}if (node->y < m - 1) {t = f[node->x][node->y + 1];if (!t->v) {t->v = true;t->w = max(t->h, node->w);heap.push_back(t);int idx = HeapUp(heap, heap.size() - 1);HeapDown(heap, idx);}}heap[0] = heap[heap.size() - 1];heap.pop_back();HeapDown(heap, 0);}int ret = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {ret += f[i][j]->w - f[i][j]->h;
//                printf("%d ", f[i][j]->w - f[i][j]->h);}
//            printf("\n");}return ret;}int HeapUp(vector<Node*>& heap, int idx) {if (idx == 0) {return idx;}int tmp = (idx - 1) / 2;Node* t = heap[tmp];if (t->w > heap[idx]->w) {heap[tmp] = heap[idx];heap[idx] = t;return HeapUp(heap, tmp);}return idx;}int HeapDown(vector<Node*>& heap, int idx) {int tmp = -1;if (idx * 2 + 1 < heap.size()) {tmp = idx * 2 + 1;if (tmp + 1 < heap.size()) {if (heap[tmp + 1]->w < heap[tmp]->w) {tmp++;}}}if (tmp >= 0 && heap[idx]->w > heap[tmp]->w) {Node* t = heap[idx];heap[idx] = heap[tmp];heap[tmp] = t;return HeapDown(heap, tmp);}return idx;}
};


http://www.ppmy.cn/embedded/155228.html

相关文章

【RK3588嵌入式图形编程】-SDL2-创建应用窗口

创建应用窗口 文章目录 创建应用窗口1、认识SDL及安装1.1 什么是SDL1.2 SDL安装2、应用程序准备3、应用程序实现3.1 创建窗口3.2 Window类3.3 Surface3.4 SDL_FillRect3.5 颜色和SDL_MapRGB()3.6 SDL_UpdateWindowSurface3.7 SDL_DestroyWindow()3.8 main函数4、总结SDL2是一个…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架&#xff0c;旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

stm32控制直流电机程序

在STM32微控制器上控制直流电机通常涉及使用PWM&#xff08;脉宽调制&#xff09;信号来调节电机的速度&#xff0c;并通过GPIO&#xff08;通用输入输出&#xff09;端口来控制电机的启动、停止和方向。以下是一个简化的STM32控制直流电机的程序示例&#xff0c;该程序使用STM…

指针的进阶

指针的主题&#xff0c;我们在初级阶段的《指针》章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1. 指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff0…

Spring Boot 实战:轻松实现文件上传与下载功能

目录 一、引言 二、Spring Boot 文件上传基础 &#xff08;一&#xff09;依赖引入 &#xff08;二&#xff09;配置文件设置 &#xff08;三&#xff09;文件上传接口编写 &#xff08;一&#xff09;文件类型限制 &#xff08;二&#xff09;文件大小验证 &#xff0…

【Java回顾】Day7 Java IO|分类(传输方式,数据操作)|零拷贝和NIO

# Java IO 知识体系 IO-分类(传输&#xff0c;操作) 传输方式 字节流 字符流 字节流和字符流的区别 字节流读取单个字节&#xff0c;字符流读取单个字符字节流来处理二进制文件(图片&#xff0c;MP3&#xff0c;视频文件)&#xff0c;字符流(文本文件(特殊的二进制文件&a…

linux分配磁盘空间命令

使用命令lsblk查询linux磁盘空间时&#xff0c;发现空间并没有被分配完 如图&#xff0c;600G&#xff0c;但实际分配了一共199G&#xff0c;剩余500G&#xff0c;我们需要通过命令进行剩余存储的分配。 思路&#xff1a;创建新的分区->更新内核分区表->初始化新分区作…

Harmony OS 5.0.1 模拟器报未开启 Hyper-V解决方法

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java、嵌入式、鸿蒙、人工智能等,专注于程序员成长那点儿事,希望在成长的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 今天在写Harmony NEXT版本的元服务的时候&#xff0c;突然模拟器无法启动了&#xff0…