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 ...
随机推荐
- 9. 实现包括前端后台的预约洗狗功能 - 使用Power App处理预约信息 - 创建Power Canvas App并实现基础功能
Power Canvas App可以通过画布设计和构建业务应用,无需通过传统编写代码的形式来构建,通过将元素拖动到画布上来设计我们的Power Canvas APP,可以与Miceosoft和第三 ...
- Identityserver4 ClientCredentials授权
转自:https://www.cnblogs.com/hyqq/p/14138024.html:侵删. Client Credentials 客户端应用不代表用户,客户端应用本身就相当于资源所有者 通 ...
- MySQL学习(十三)InnoDB
参考博客: https://my.oschina.net/wangzemin/blog/5346534 InnoDB之BufferPool https://juejin.cn/post/7007421 ...
- ChannelInboundHandlerAdapter 与 SimpleChannelInboundHandler 功能详解
SimpleChannelInboundHandler [类的关系]:如下就是两个类的声明,SimpleChannelInboundHandler是继承 ChannelInboundHandlerAd ...
- Trie树结构
PrefixTree 208. 实现 Trie (前缀树) Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键.这一数据结构 ...
- Redis分布式Session和普通的cookie session有什么区别?
Redis 是一种高性能的缓存和 key-value 存储系统,常被用来实现分布式 Session 的方案.在这种方案中,用户的登录信息存储在 Redis 中,而不是存储在本地的 cookie 或 s ...
- 内网搭建DNS服务器
DNS:Domain Name Service,域名解析服务 监听端口:udp/53,tcp/53 应用程序:bind 根域:. 一级域: 组织域:.com, .org, .net, .mil, .e ...
- 关于 IDP 的五大认知误解
内部开发者平台(IDP)是近年来在希望加快软件交付和改善开发者体验的企业中得到普及的一个概念.然而,大众对于什么是 IDP 以及它能为开发者和企业带来什么也有很多困惑和误解.在这篇文章中,我们将尝试解 ...
- Java设计模式 —— 享元模式
14 享元模式 14.1 享元模式概述 Flyweight Pattern: 运用共享技术有效地支持大量细粒度对象的复用. 当系统中存在大量相同或相似的对象时,它通过共享技术实现相同或相似的细粒度对象 ...
- React框架使用
一:使用Vite创建React项目 二:React中组件使用 import React, { Component, useState } from "react"; //使用cla ...