LeetCode 407. 接雨水 II (优先队列)
从最外圈开始不断向内遍历,如果内部的高度小于外部的高度,则证明该位置可以蓄水,否则不能,水会顺着该外圈流出去。
每次都处理外圈高度最小的那个位置 a,遍历它的四周。
如果它旁边的某个位置 b 高度小于 a,则证明 b 可以蓄水,因为 a 已经是四周最小的高度了,则 b 可以蓄水的大小就是 height(a)-height(b)
如果 b 的高度大于 a 则不能蓄水,水会顺着 a 流出去。
处理完 a 周围的所有位置后,把 a 删除,把 a 周围的位置当做新的边界。
其中,如果 a 周围的高度有小于 a 的,就补齐到 a,因为其是被 a 围住的,注水时高度不可能小 a。而如果高度大于 a 不用处理。
具体实现,先把最外圈的所有高度压入优先队列,然后每次取高度最小的去处理就可以了。
理解了还是觉得有点抽象。有一说一。其他题解一个都没看懂。
struct node {
int x, y, h;
node() {}
node(int x, int y, int h): x(x), y(y), h(h) {}
bool operator<(const node &rhs) const {
return h > rhs.h; // 保证优先队列是小顶堆
}
};
class Solution {
public:
int trapRainWater(vector<vector<int>>& heightMap) {
priority_queue<node> q;
int n = heightMap.size(), m = heightMap[0].size();
vector<vector<int>> visited(n, vector<int>(m, 0));
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (i == 0 || j == 0 || i == n - 1 || j == m - 1) {
q.emplace(i, j, heightMap[i][j]);
visited[i][j] = 1;
}
}
}
int dir[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int ans = 0;
while (q.size()) {
node cur = q.top(); q.pop();
for (int i = 0; i < 4; i++) {
int nx = cur.x + dir[i][0];
int ny = cur.y + dir[i][1];
if (nx < n && nx >= 0 && ny < m && ny >= 0 && !visited[nx][ny]) {
if (heightMap[nx][ny] < cur.h) {
ans += cur.h - heightMap[nx][ny];
q.emplace(nx, ny, cur.h);
} else {
q.emplace(nx, ny, heightMap[nx][ny]);
}
visited[nx][ny] = 1;
}
}
}
return ans;
}
};
LeetCode 407. 接雨水 II (优先队列)的更多相关文章
- Java实现 LeetCode 407 接雨水 II(二)
407. 接雨水 II 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高 ...
- Leetcode 407.接雨水
接雨水 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高度都大于0 且小 ...
- LeetCode Single Number I / II / III
[1]LeetCode 136 Single Number 题意:奇数个数,其中除了一个数只出现一次外,其他数都是成对出现,比如1,2,2,3,3...,求出该单个数. 解法:容易想到异或的性质,两个 ...
- [array] leetcode - 40. Combination Sum II - Medium
leetcode - 40. Combination Sum II - Medium descrition Given a collection of candidate numbers (C) an ...
- LeetCode 137. Single Number II(只出现一次的数字 II)
LeetCode 137. Single Number II(只出现一次的数字 II)
- LeetCode:路径总和II【113】
LeetCode:路径总和II[113] 题目描述 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例:给定如下二叉树, ...
- LeetCode:组合总数II【40】
LeetCode:组合总数II[40] 题目描述 给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candi ...
- LeetCode:接雨水【42】
LeetCode:接雨水[42] 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1, ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水 II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- [LeetCode] 407. Trapping Rain Water II 收集雨水之二
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
随机推荐
- JMeter+Ant+Jenkins接口自动化测试框架(Windows)
一:简介 大致思路:Jmeter可以做接口测试,也能做压力测试,而且是开源软件:Ant是基于Java的构建工具,完成脚本执行并收集结果生成报告,可以跨平台,Jenkins是持续集成工具.将这三者结合起 ...
- python网络通信:IP/端口基础知识
1.学习网络编程的目的 将多个设备通过网络连接在一起,进行数据共享 2.IP地址 作用:在逻辑上标记一台电脑 特点:没有重复的 3.通过收发数据理解IP地址的作用 dest ip 表示目的ip/src ...
- ChatGPT的作用(附示例)
ChatGPT介绍(内容由ChatGPT生成) ChatGPT是一款基于GPT(生成式预测网络)的聊天机器人,它可以根据用户输入自动生成相应的回复. GPT是由OpenAI开发的一种预测网络模型,其中 ...
- Jmeter JDBC连接配置
JDBC连接配置(JDBC Connection Configuration),用于创建数据库连接,后续可对数据库进行增删查等操作.和组件[JDBC请求(JDBC Request)]搭配使用 组件路径 ...
- 吃透 JVM 诊断方法与工具使用
JVM(Java虚拟机)是Java程序运行的基础环境,它提供了内存管理.线程管理和性能监控等功能.吃透JVM诊断方法,可以帮助开发者更有效地解决Java应用在运行时遇到的问题.以下是一些常见的JVM诊 ...
- 【JavaScript】下拉联动回显问题
首先是多级下拉联动实现: 这是DOM结构: <div> <label style="margin-left: 10px;display: inline-block;&quo ...
- 【Vue】08 Webpack Part4 使用Vue
新建一个目录创建Vue项目: cd .. mkdir webpack-vue cd webpack-vue 安装Vue cnpm install vue 保持之前的目录结构: 在Main.js中引用V ...
- douyin 今日头条 巨量登录滑块和douyin详情滑块分析
声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均 ...
- 【转载】SLAM领域的优秀作者与实验室汇总
原地址: https://blog.csdn.net/m0_37874102/article/details/114365837 总结一些之前看过的SLAM(VO,VIO,建图)文献所发表的实验室和作 ...
- ubuntu系统下 vscode中如何指定conda环境
参考: https://blog.csdn.net/mieleizhi0522/article/details/89336321 =================================== ...