2021-07-15:接雨水 II。给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。
2021-07-15:接雨水 II。给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。
福大大 答案2021-07-15:
小根堆+是否访问矩阵。思路跟昨天的每日一题差不多,但代码相对复杂。昨天的每日一题,是两端的柱子逐步向中间移动,收集到的雨水就是答案。今天的每日一题,是一圈的柱子逐个向中间移动,收集到的雨水就是答案。一圈的柱子需要放在小根堆中。新增矩阵记录是否访问过。
时间复杂度:O(NNlogN)。
空间复杂度:约O(N*N)。
代码用golang编写。代码如下:
package main
import (
"fmt"
"sort"
)
func main() {
heightMap := [][]int{
{1, 4, 3, 1, 3, 2},
{3, 2, 1, 3, 2, 4},
{2, 3, 3, 2, 3, 1},
}
ret := trapRainWater(heightMap)
fmt.Println(ret)
}
func trapRainWater(heightMap [][]int) int {
if len(heightMap) == 0 || len(heightMap[0]) == 0 {
return 0
}
N := len(heightMap)
M := len(heightMap[0])
isEnter := make([][]bool, N)
for i := 0; i < N; i++ {
isEnter[i] = make([]bool, M)
}
heap := make([]*Node, 0)
for col := 0; col < M-1; col++ {
isEnter[0][col] = true
Push(&heap, NewNode(heightMap[0][col], 0, col))
}
for row := 0; row < N-1; row++ {
isEnter[row][M-1] = true
Push(&heap, NewNode(heightMap[row][M-1], row, M-1))
}
for col := M - 1; col > 0; col-- {
isEnter[N-1][col] = true
Push(&heap, NewNode(heightMap[N-1][col], N-1, col))
}
for row := N - 1; row > 0; row-- {
isEnter[row][0] = true
Push(&heap, NewNode(heightMap[row][0], row, 0))
}
water := 0
max := 0
for Len(&heap) > 0 {
cur := Pop(&heap)
max = getMax(max, cur.Val)
r := cur.Row
c := cur.Col
if r > 0 && !isEnter[r-1][c] {
water += getMax(0, max-heightMap[r-1][c])
isEnter[r-1][c] = true
Push(&heap, NewNode(heightMap[r-1][c], r-1, c))
}
if r < N-1 && !isEnter[r+1][c] {
water += getMax(0, max-heightMap[r+1][c])
isEnter[r+1][c] = true
Push(&heap, NewNode(heightMap[r+1][c], r+1, c))
}
if c > 0 && !isEnter[r][c-1] {
water += getMax(0, max-heightMap[r][c-1])
isEnter[r][c-1] = true
Push(&heap, NewNode(heightMap[r][c-1], r, c-1))
}
if c < M-1 && !isEnter[r][c+1] {
water += getMax(0, max-heightMap[r][c+1])
isEnter[r][c+1] = true
Push(&heap, NewNode(heightMap[r][c+1], r, c+1))
}
}
return water
}
type Node struct {
Val int
Row int
Col int
}
func NewNode(v int, r int, c int) *Node {
ret := &Node{}
ret.Val = v
ret.Row = r
ret.Col = c
return ret
}
func Push(heap *[]*Node, node *Node) {
*heap = append(*heap, node)
}
func Pop(heap *[]*Node) *Node {
sort.Slice(*heap, func(i, j int) bool {
return (*heap)[i].Val < (*heap)[j].Val
})
ans := (*heap)[0]
*heap = (*heap)[1:]
return ans
}
func Len(heap *[]*Node) int {
return len(*heap)
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下:
2021-07-15:接雨水 II。给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。的更多相关文章
- [Swift]LeetCode407. 接雨水 II | Trapping Rain Water II
Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...
- 407 Trapping Rain Water II 接雨水 II
给定一个m x n的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水.说明:m 和 n 都是小于110的整数.每一个单位的高度都大于0 且小于 20000. ...
- Java实现 LeetCode 407 接雨水 II(二)
407. 接雨水 II 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高 ...
- [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 ...
- 2021.12.15 P2328 [SCOI2005]超级格雷码(找规律填空)
2021.12.15 P2328 [SCOI2005]超级格雷码(找规律填空) https://www.luogu.com.cn/problem/P2328 题意: 输出n位B进制的格雷码. 分析: ...
- 2021.07.17 题解 CF1385E Directing Edges(拓扑排序)
2021.07.17 题解 CF1385E Directing Edges(拓扑排序) CF1385E Directing Edges - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) ...
- 2021.07.09 K-D树
2021.07.09 K-D树 前置知识 1.二叉搜索树 2.总是很长的替罪羊树 K-D树 建树 K-D树具有二叉搜索树的形态,对于每一个分类标准,小于标准的节点在父节点左边,大于标准的节点在父节点右 ...
- 2021.07.02 P1383 高级打字机题解(可持久化平衡树)
2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...
- 2021.07.02 UVa1197 多路归并模板
2021.07.02 UVa1197 多路归并模板 UVA11997 K Smallest Sums - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 分析: 题解 UVA11997 ...
- 2021.07.26 P1022 计算器的改良(字符串)
2021.07.26 P1022 计算器的改良(字符串) 改进: 如果是我出题,我一定把未知数设为ab.buh.bluesky之类的长度不只是1的字符串! 题意: 一个一元一次方程,求解. 分析: 1 ...
随机推荐
- axios utils axios.postForm
npm install axios -S 目录 ajax.js 请求工具 /* ajax请求函数模块 返回值: promise对象(异步返回的数据是: response.data) */ impo ...
- windows下配置JDK教程
1.思路: 首先要确定所要用的应用可以兼容哪个版本jdk,然后开始下载对应的版本,最后安装,配置环境变量,测试,部署完成. 2.jdk下载地址: 如果下载全新的jdk可以直接百度jdk官网下载 如果需 ...
- C#比较类/接口、Dictionary 排序
作者:l625208058 链接:https://www.jianshu.com/p/cd1be6652570 先 F12 看下 List.Sort() 方法 public void Sort(int ...
- celery在Django项目中的使用案例
一.逻辑分析 第一步:在项目根目录新建包 第二步:在使用提交异步任务的位置,导入使用即可 视图函数中使用,导入任务 任务.delay() # 提交任务 第三步:启动worker,如果有定时任务,启动b ...
- Linux0.11源码学习(四)
Linux0.11源码学习(四) linux0.11源码学习笔记 参考资料: https://github.com/sunym1993/flash-linux0.11-talk https://git ...
- 使用 zeromq与cppzmq 程序退出遇到的坑
在使用zeromq 退出的时候还遇到一点坑,对于服务deaman(守护进程)化的进程可能会遇到这个问题. 现象: 这个问题导致的现象是服务一旦关闭(stop),就会 core dump,core du ...
- Shell脚本监控Centos 7系统运行状态
#!/usr/bin/bash ## @date: 2021-08-17 ## This is a script for security operation indicator monitoring ...
- Jira使用浅谈篇二
本篇参考:https://university.atlassian.com/student/collection/850385/path/1083901 本篇接上文,上文已经对项目设置了一个基础的配置 ...
- 【ACM算法竞赛日常训练】DAY1题解与分析
DAY1 共四题: 月月查华华的手机:https://ac.nowcoder.com/acm/problem/23053 Rinne Loves Edges:https://ac.nowcoder.c ...
- 算法学习笔记(20): AC自动机
AC自动机 前置知识: 字典树:可以参考我的另一篇文章 算法学习笔记(15): Trie(字典树) KMP:可以参考 KMP - Ricky2007,但是不理解KMP算法并不会对这个算法的理解产生影响 ...