Leetcode刷题详解——太平洋大西洋水流问题

1. 题目链接:417. 太平洋大西洋水流问题

2. 题目描述:

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

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

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

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

示例 1:

img

输入: 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.leng th
  • n == heights[r].length
  • 1 <= m, n <= 200
  • 0 <= heights[r][c] <= 105

3. 解法:

算法思路:

正难则反

如果直接去判断某一个位置是否既能到大西洋也能到太平洋,会重复遍历很多路径

我们反着来,从大西洋沿岸开始反向dfs,这样就能找到哪些点可以流向大西洋;同理,从太平洋沿岸也反向dfs,这样就能找出哪些点可以流向太平洋。那么,被标记两次的点,就是我们要找的结果。

  1. 定义两个二维布尔数组pacatl,分别表示太平洋区域和大西洋区域。
  2. 从四个边界开始进行深度优先搜索,将可以到达太平洋的区域标记为true
  3. 再次从四个边界开始进行深度优先搜索,将可以到达大西洋的区域标记为true
  4. 遍历整个矩阵,如果某个单元格同时在pacatl中被标记为true,那么就将其添加到结果数组中。

请添加图片描述

C++算法代码:

class Solution {
    int m,n; // 定义两个变量m和n,分别表示矩阵的行数和列数
    int dx[4]={0,0,1,-1}; // 定义一个数组dx,表示四个方向的横坐标偏移量
    int dy[4]={1,-1,0,0}; // 定义一个数组dy,表示四个方向的纵坐标偏移量
public:
    vector<vector<int>> pacificAtlantic(vector<vector<int>>& heights) {
        m=heights.size(),n=heights[0].size(); // 获取矩阵的行数和列数
        vector<vector<bool>> pac(m,vector<bool>(n)); // 定义一个二维布尔数组pac,表示太平洋区域
        vector<vector<bool>> atl(m,vector<bool>(n)); // 定义一个二维布尔数组atl,表示大西洋区域
        //先处理pac洋
        for(int j=0;j<n;j++) dfs(heights,0,j,pac); // 从第一行的每一列开始进行深度优先搜索
        for(int i=0;i<m;i++) dfs(heights,i,0,pac); // 从第一列的每一行开始进行深度优先搜索
        //处理atl洋
        for(int i=0;i<m;i++) dfs(heights,i,n-1,atl); // 从最后一行的每一列开始进行深度优先搜索
        for(int j=0;j<n;j++) dfs(heights,m-1,j,atl); // 从最后一列的每一行开始进行深度优先搜索

        vector<vector<int>> ret; // 定义一个二维整数数组ret,用于存储最终结果
        for(int i=0;i<m;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(pac[i][j]&&atl[i][j]) // 如果当前位置同时属于太平洋和大西洋区域
                {
                    ret.push_back({i,j}); // 将该位置添加到结果数组中
                }
            }
        }
        return ret; // 返回结果数组
    }
    void dfs(vector<vector<int>>&heights,int i,int j,vector<vector<bool>>& vis) // 定义深度优先搜索函数
    {
        vis[i][j]=true; // 标记当前位置已访问
        for(int k=0;k<4;k++) // 遍历四个方向
        {
            int x=i+dx[k],y=j+dy[k]; // 计算下一个位置的坐标
            if(x>=0 && x<m && y>=0 && y<n && !vis[x][y] && heights[x][y]>=heights[i][j]) // 如果下一个位置在矩阵范围内且未被访问过且高度大于等于当前位置的高度
            {
                dfs(heights,x,y,vis); // 继续深度优先搜索
            }
        }
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B : 赫夫曼编码长度

Description 每行一个大小写英文字母组成的字符串&#xff0c;长度不大于 1000&#xff0c;通过前缀编码后最短的编码长度。 Input 每组数据一行&#xff0c;大小写英文字母 Output 每组数据输出赫夫曼编码长度 Sample 思路&#xff1a; string res "";//用于…

市场火爆的AI实景自动直播是什么?一文带你了解清楚!

最近AI实景自动直播在各大短视频平台爆火出了新高度&#xff0c;在如今全民直播的时代&#xff0c;直播已经成为大多数商家商家必须要会的技能&#xff0c;包括全国头部品牌也在纷纷加码直播&#xff0c;甚至早早就开启了直播矩阵的玩法&#xff0c;中腰部商家也在考虑如何入手…

【3】Spring Boot 3 集成mybatis-plus+druid+mysql

目录 【3】Spring Boot 3 集成组件&#xff1a;Druid Mybatis Plus Mysql集成方案1. Hikari jdbc mysql 集成方案增加依赖添加配置Spring Testng 测试用例 2. Druid Mybatis Plus Mysql集成方案2.1 配置Druid添加依赖配置启动Spring Boot Web StarterSpring Testng测试用…

Linux开发工具03:使用GCC、make和CMake编译代码

写在前面 这里主要记录一下如何使用GCC、make和CMake编译代码&#xff1b; 一、GCC g是GCC下专门用于编译C项目的编译器&#xff1b; 假设目录结构如下&#xff1a; include&#xff1a;包含分离的.h和.cpp文件&#xff1b;src&#xff1a;包含主函数入口main.cpp&#xff1…

双点重发布+路由策略实验

一、双点重发布实验 1、实验拓扑图 2、各路由器IP地址、环回地址配置 R1 R2 R3 R4 3、启动RIP和OSPF 4、双向重发布 5、查看路由信息 6、更改网络类型 6、抓取流量 二、路由策略实验 1、实验拓扑图 2、各路由器IP地址的配置 3、启动RIP和OSPF 3、重发布 4、抓取流量 5、创建…

电脑屏幕标记软件——Pointofix

前言 Pointofix是一款由德国人开发的屏幕标记软件&#xff0c;德国人的工匠精神&#xff0c;是出了名的&#xff0c;德国人开发的软件也一样。 Pointofix体积非常小巧&#xff0c;安装包只有1MB大小&#xff0c;使用Pointofix可以直接在屏幕上面写字、画图、标重点。 下面介…

为什么Springboot项目中有些写法继承了SpringBootServletInitializer类?Springboot的两种发布方式

文章目录 一、前言二、SpringBoot的两种发布方式2.1、内置容器运行2.2、外置容器&#xff08;Tomcat&#xff09;运行 三、扩展3.1、如何将 Spring Boot 项目打包成 war 包&#xff1f; 一、前言 在一次SpringBoot源码中看到了启动类中继承了SpringBootServletInitializer&…

数据结构-二叉树的前、中、后序遍历

目录 1. 二叉树的遍历 1.1 前序 1.2 中序 1.3 后序 1.4 遍历的复杂度 2.二叉树节点个数及高度的计算 2.1 二叉树节点个数 2.2 二叉树叶子节点的个数 2.3 二叉树高度 2.4 二叉树第k层节点个数 1. 二叉树的遍历 前面的章节中&#xff0c;我们学习了二叉树的顺序结构&am…

Python入门:一文详解Python列表(List)操作方法

文章目录 前言一、创建一个列表二、访问列表中的值三、更新列表四、删除列表元素六、Python列表截取七、Python列表操作的函数和方法关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②…

【thop.profile】thop.profile计算网络参数量和计算效率

&#x1f34b;&#x1f34b;1.安装thop 安装thop有两种方式。 &#x1f3c6;第一种 pip install thop &#x1f3c6;第二种 用源码编译安装 从官网下载【github】thop安装压缩包下载压缩文件&#xff0c;解压到虚拟环境的site-packages文件下激活进入自己的虚拟环境cd到压缩…

不同类型的软件企业该如何有效的管理好你的软件测试团队?

最近在网上发现一篇记录了2012年《[视频]作为测试经理如何有效管理好你的软件测试团队》的文字内容&#xff0c;感谢记录的人&#xff0c;我也保存一下。顺便将演讲中的PPT重点截图也放上来&#xff0c;一并保存了&#xff01;。由于是现场速记&#xff0c;过度的口语化&#x…

迅为iTOPRK3588开发板系统定制(无法联网)

在上一个小节中讲解了 ubuntu 和 debian 文件系统的定制&#xff0c;但那是在可以运行脚本正常构 建系统的前提下&#xff0c;而本小节则是针对部分特殊用户无法联网的情况。 在 source 目录下存放了已经构建完成的压缩包&#xff0c;如下图所示&#xff1a; 然后使用以下命令…

weblogic控制台登陆console的时候慢

我们在搭建完weblogic后&#xff0c;登录控制台时&#xff0c;会出现等待很长时间的情况。 如下图&#xff1a;怎么解决呢 连接所属服务器,.找到jdk的安装路径 [rootlocalhost lib]# echo $JAVA_HOME/ /usr/java/jdk1.8.0_161/ 进入jre下的lib目录下的security目录&#xff0…

全球市场的新趋势:海外网红营销和私域流量的共同驱动

在数字时代的今天&#xff0c;随着全球互联网的蓬勃发展&#xff0c;网络营销已经不再是一种新鲜事物。然而&#xff0c;随着社交媒体和在线内容创作的兴起&#xff0c;一种新的营销方式崭露头角&#xff0c;它将海外网红营销与私域流量相结合&#xff0c;成为了全球市场的一股…

刘家窑中医院医生王忠:以仁心诠释医者使命

王忠是刘家窑中医院的一名医生&#xff0c;从医多年&#xff0c;积累了丰富的临床经验&#xff0c;挽救了无数病人的生命。他以“想病人之所想&#xff0c;急病人之所急”为自己行医济世的人生格言。 病人说&#xff1a;他是一位可亲可敬的“亲人”。 “医以德为本&#xff0c…

【Proteus仿真】【STM32单片机】拔河游戏设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用按键、LED、动态数码管模块等。 主要功能&#xff1a; 系统运行后&#xff0c;指示灯处于中间位置&#xff0c;数码管显示得分0&#xff0c;当…

MySQL主从复制、读写分离(利用Amoeba和Mycat)、完全同步

目录 一、主从复制 1、概念 1.1主从复制延迟问题&#xff1a; 1.2、MySQL安全和性能配置&#xff1a; 1.3、主从复制的工作过程&#xff1a; 1.4、mysql主从复制注意点&#xff1a; 1.5、MySQL的主从复制的模式&#xff1a; 2、主从复制实验&#xff1a; 二、读写分离&…

【ccf-csp题解】第11次csp认证-第三题-Json查询超详细讲解

此题思路来源于acwing ccfcsp认证辅导课 题目描述 思路分析 此题的难点在于对输入的内容进行解析&#xff0c;题目中说除了保证字符串内容不会有空格存在之外&#xff0c;其它的任意地方都可能出现空格&#xff0c;甚至在某些地方还会出现空行&#xff0c;这样的话&#xff0…

由于找不到msvcp140.dll无法继续执行代码有哪些解决方法

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一个组件&#xff0c;它是运行许多Windows应用程序所必需的。当msvcp140.dll丢失或损坏时&#xff0c;可能会导致以下问题&#xff1a; 1. 程序无法启动或崩溃。 2. 系统出现错误提示&#xff0c;如“找不到msvcp140…

离散卡尔曼滤波器算法详解及重要参数(Q、R、P)的讨论

公开数据集中文版详细描述参考前文&#xff1a;https://editor.csdn.net/md/?not_checkout1&spm1011.2124.3001.6192神经元Spike信号分析参考前文&#xff1a;https://blog.csdn.net/qq_43811536/article/details/134359566?spm1001.2014.3001.5501神经元运动调制分析参考…