数据结构与算法之图: Leetcode 417. 太平洋大西洋水流问题 (Typescript版)

news2025/1/5 0:16:44

太平洋大西洋水流问题

  • https://leetcode.cn/problems/pacific-atlantic-water-flow/description/

描述

  • 有一个 m × n 的矩形岛屿,与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界,而 “大西洋” 处于大陆的右边界和下边界。

  • 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights , heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。

  • 岛上雨水较多,如果相邻单元格的高度 小于或等于 当前单元格的高度,雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。

  • 返回网格坐标 result 的 2D 列表 ,其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。

示例 1


输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]]
输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]

示例 2

输入: heights = [[2,1],[1,2]]
输出: [[0,0],[0,1],[1,0],[1,1]]

提示

  • m == heights.length
  • n == heights[r].length
  • 1 <= m, n <= 200
  • 0 <= heights[r][c] <= 1 0 5 10^5 105

算法

1 )基于深度优先遍历递归实现

function pacificAtlantic(matrix: number[][]): number[][] {
    if(!matrix || !matrix[0]?.length) {return [];}
    const m = matrix.length;
    const n = matrix[0].length;
    // 两个矩阵
    const flow1 = Array.from({length: m}, ()=> new Array(n).fill(false)); // 大西洋
    const flow2 = Array.from({length: m}, ()=> new Array(n).fill(false)); // 太平洋
    // 深度优先遍历 r行,c列,r,c 是当前节点坐标的意思,flow 矩阵
    const dfs = (r: number, c: number, flow: boolean[][]) => {
        flow[r][c] = true; // 边界和符合条件的是已经确定了的,可直接填充
        // 遍历这个节点的相邻节点,上下左右节点
        const current = [[r-1, c], [r+1, c], [r, c-1], [r, c+1]];
        current.forEach(([nr, nc]) => {
            // 保证在矩阵中, 防止死循环, 不在之前的矩阵中 保证逆流而上, 下个节点的值要 >= 上个节点的值
            const flag = nr >=0 && nr < m && nc >= 0 && nc < n && !flow[nr][nc] && matrix[nr][nc] >= matrix[r][c];
            flag && dfs(nr, nc, flow);
        })
    }
    // 从海岸线多管齐下,对太平洋来说是第一行和第一列;对大西洋来说是第一列和最后一行
    // 第一列和最后一列
    for(let r = 0; r < m; r++) {
        dfs(r, 0, flow1);
        dfs(r, n-1, flow2);
    }
    // 第一行和最后一行
    for(let c = 0; c < n; c++) {
        dfs(0, c, flow1);
        dfs(m-1, c, flow2);
    }
    // 收集能留到两个大洋的坐标
    const res = [];
    for(let r = 0; r < m; r++) {
        for(let c = 0; c < n; c++) {
            if(flow1[r][c] && flow2[r][c]) {
                res.push([r,c])
            }
        }
    }
    return res;
}
  • 整体思路
    • 准备两个矩阵用于存储大西洋和太平洋符合条件的点位
    • 从第一列,最后一列,第一行,最后一行开始, 这些都是确认可直接填充true的位置
    • 使用深度优先遍历, 找到每个节点的有效邻居,匹配符合条件的点位
    • 最后对两个矩阵取相同位置,即为最终结果
  • 时间复杂度 O(m*n)
    • 大量嵌套for循环,遍历m*n的格子
  • 空间复杂度 O(m*n)
    • 用到两个变量flow1, flow2
    • 矩阵尺寸 m*n

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

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

相关文章

Elsevier上传LaTeX修改稿常见问题解决方法

在撰写科研论文时&#xff0c;一般会使用latex或者word两种工具。在论文的返修阶段&#xff0c;很多期刊要求我们上传可编辑格式的稿件。word在上传到爱思唯尔系统中时候很方便&#xff0c;但latex是较为麻烦的&#xff0c;下面和大家分享一下我在上传latex手稿时遇到的一些问题…

【人工智能】LLM 大型语言模型和 Transformer 架构简介

目录 大型语言模型 (LLM) 一、LLM的起源 二、LLM的发展阶段 三、LLM的应用领域

torch.nn.Parameter()

一文通俗理解torch.nn.Parameter() 一、起源 首先&#xff0c;我写这篇文章的起源是因为&#xff0c;我突然看到了一段有关torch.nn.Parameter()的代码。 因此就去了解了一下这个函数&#xff0c;把自己的一些理解记录下来&#xff0c;希望可以帮到你。 二、官方文档 网址如下…

单目3D目标检测[基于几何约束篇]

基于语义和几何约束的方法 1. Deep3DBox 3D Bounding Box Estimation Using Deep Learning and Geometry [CVPR2017]https://arxiv.org/pdf/1612.00496.pdfhttps://zhuanlan.zhihu.com/p/414275118 核心思想&#xff1a;通过利用2D bounding box与3D bounding box之间的几何约…

直播录屏没有声音?解决方案来了!

在进行游戏直播、教程制作或在线会议录制时&#xff0c;有声音的录屏是至关重要的。然而&#xff0c;有时用户可能会面临直播录屏没有声音的问题。在本文中&#xff0c;我们将介绍两种常用的方法来解决这个问题&#xff0c;通过遵循下面的步骤&#xff0c;您将能够轻松地添加声…

Osgb转3DTiles工具

三维倾斜摄影生产主要格式为Osgb&#xff0c;目前三维模型主要展示场景为web&#xff0c;大部分使用框架都是Cesium库&#xff0c;格式为 3DTiles&#xff0c;目前市面上osgb转3DTiles的软件已经有好几个&#xff0c;付费免费都有。 先说免费软件&#xff1a; 1、CesiumLab …

SaaS是云计算服务,不是互联网平台

习惯性的把SaaS云计算服务&#xff0c;理解成平台&#xff0c;是不对的&#xff01; SaaS本质就是云计算服务&#xff0c;企业在saas应用系统里操作业务&#xff0c;背后都是各种云计算操作。 但是&#xff0c;中国的互联网环境就都是巨头平台所主导&#xff0c;所以大家基本…

华为OD机试 - 寻找最大价值的矿堆 - 矩阵(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、Java算法源码五、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多…

工具让公众号推送变得轻而易举

公众号运营的关键在于定期向用户推送内容&#xff0c;但手动推送过程繁琐且浪费时间。现在&#xff0c;有了乔拓云公众号助手工具&#xff0c;你可以轻松实现公众号的自动推送功能。让我们一起来看看如何操作吧&#xff01; 首先&#xff0c;你需要注册一个乔拓云公众号助手工具…

阿里云新品云服务器实例,经济型e实例,价格便宜,性价比高

前不久&#xff0c;阿里云推出了一款全新云服务器实例&#xff0c;他是阿里云面向个人开发者、学生、小微企业&#xff0c;在中小型网站建设、开发测试、轻量级应用等场景推出的全新入门级云服务器&#xff0c;基于“飞天CIPU”黄金技术架构设计&#xff0c;可轻松满足网站建设…

C语言指针详解——必备7大知识点

Part1指针是什么? 1.1 浅谈指针 理解指针的 两个要点&#xff1a; 指针是内存中一个最小单元的编号&#xff0c;也就是地址&#xff1b; 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量。 总结&#xff1a;指针就是地址&#xff…

UPS负载箱的工作原理是什么?

UPS负载箱&#xff08;Uninterruptible Power Supply Load Bank&#xff09;内部包含一组电阻器&#xff0c;通过调节电阻值来模拟不同负载条件。当UPS供电时&#xff0c;电阻器会吸收一定的电能&#xff0c;从而模拟实际负载对UPS的需求。UPS负载箱配备了控制系统&#xff0c;…

2023年京东双11京享红包领取入口介绍

2023年京东双11京享红包领取入口介绍 抢京东2023年双11超级红包共计4步骤即可。在今天京东公布了2023年双11红包密令&#xff0c;这是最新准确有效的哦!建议大家提前收藏密令&#xff0c;开始时间是10月23日生效。具体的2波时间见后&#xff0c;下面跟随小编一起来看看抢红包教…

DC电源模块的数字电源优势

BOSHIDA DC电源模块的数字电源优势 数字电源模块是指在电源的设计和控制上采用数字式方案&#xff0c;采用数字化技术&#xff0c;将传统的电源模块从模拟传统电源转变为数字电源变成的模块。 传统的电源模块使用模拟技术&#xff0c;其主要优势在于可控性高、稳定性好&#…

2-MySQL的基本操作记录

1 数据库相关 -- --------------------表相关的---------- -- 查看字符集 show variables like %character%;show databases;# 创建数据库 create database test2;# 删除数据库 drop database test2; show databases;#查看当前使用的数据库 select database(); 2 用户相关 -…

Spring Boot自动配置原理揭秘

自动配置原理 概述原理Spring Boot Starterspring.factories 文件ConditionalOnX 注解配置 Bean配置属性 源码剖析 主页传送门&#xff1a;&#x1f4c0; 传送 概述 Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架。它极大地简化了 Spring 应用程序的开…

潮玩产业迈向千亿级,泡泡玛特未来发展空间可观

作为融合了艺术与创意的新品类&#xff0c;潮玩成为当下一种火热的消费现象。目前&#xff0c;全球潮玩产业处于快速增长期。近期&#xff0c;新华网联合中国社会科学院财经战略研究院发布的《超越潮流&#xff1a;千亿级潮玩产业彰显人文经济价值——潮玩产业发展报告&#xf…

华为OD机试 - 一种字符串压缩表示的解压 - 考生抽中题(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路1、题意2、根据题意&#xff0c;不合法方式如下&#xff1a;3、解题思路 五、Java算法源码六、效果展示1、输入2、输出 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为O…

Nginx 实战教程

本篇博客我会演示日常的工作中&#xff0c;我们是怎么利用nginx部署项目的。我们以部署一套前后分离的项目为本次讲述的内容 一、搭建后端项目 创建一个最简单的springboot项目&#xff1a; 只需要依赖一个web模块即可&#xff1a; 提供一个api接口&#xff0c;可以获取服务端…

周记之马上要答辩了

“ 要变得温柔和强大&#xff0c;就算哪天突然孤身一人&#xff0c;也能平静地活下去&#xff0c;不至于崩溃。” 10.16 今天提前写完了一篇六级阅读&#xff0c;积累了一些词组&#xff1a; speak out against 公然反对&#xff0c;印象最深刻的就这个&#xff1b; 先了解…