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.hqwc.cn/news/174693.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud学习(八)【RabbitMQ 服务异步通讯】

文章目录 初识 MQ同步通讯异步通讯MQ 常见框架 RabbitMQ 快速入门RabbitMQ 单机部署RabbitMQ概述常见消息模型 SpringAMQPSimpleQueue 模型WorkQueue 模型发布订阅模型发布订阅-Fanout Exchange发布订阅-DirectExchange发布订阅-TopicExchange消息转换器 初识 MQ 同步通讯 同步…

解密图像处理中的利器——直方图与均衡化

直方图与均衡化是数字图像处理中常用的重要工具&#xff0c;它们能够帮助我们更好地理解和改善图像的亮度分布。本文将首先介绍直方图的基本概念以及其在图像处理中的意义&#xff0c;接着详细阐述直方图均衡化的原理和算法。同时&#xff0c;文章将探讨直方图均衡化在图像增强…

基于Vue+SpringBoot的天然气工程运维系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目详细录屏 二、功能模块2.1 系统角色分类2.2 核心功能2.2.1 流程 12.2.2 流程 22.3 各角色功能2.3.1 系统管理员功能2.3.2 用户服务部功能2.3.3 分公司&#xff08;施工单位&#xff09;功能2.3.3.1 技术员角色功能2.3.3.2 材料员角色功能 2.3…

【Redis系列】Redis上设置key,value的时候出现NOAUTH Authentication required提示如何解决?

哈喽&#xff0c;大家好&#xff0c;我是小浪。相信大家在初学一门新的知识点的时候都会遇到各种各样的问题&#xff0c;在网上找了一大堆的解决方案&#xff0c;最后还是无功而返&#xff0c;那么今天博主就记录一下在进行Redis的一些操作中遇到的问题~ 当我们好不容易安装好R…

matlab simulink PSO算法优化simulink的PID参数

1、内容简介 略 13-可以交流、咨询、答疑 PSO算法优化simulink的PID参数 2、内容说明 标准的PSO算法优化simulink的PID参数 PSO、粒子群算法、simulink参数优化 3、仿真分析 4、参考论文 略 链接&#xff1a;https://pan.baidu.com/s/1yQ1yDfk-_Qnq7tGpa23L7g 提取码&…

计算机组成原理——指令系统题库1-20

1、以下有关指令系统的说法中错误的是什么。 A、 指令系统是一台机器硬件能执行的指令全体 B、 任何程序运行前都要先转化为机器语言 C、 指令系统是计算机软件、硬件的界面 D、 指令系统和机器语言是无关的。 2、在CPU执行指令的过程中&#xff0c;指令的地址由什么给出。…

线性模型拟合非线性数据中,如何找到最优的【分箱】数

具体的数据可以回看上一条博客。我们先来始化三个空列表&#xff0c;用于存储后续计算的预测得分、交叉验证得分的平均值和交叉验证得分的方差。 pred,score,var [], [], [] 2. 再定义一个列表&#xff0c;包含了我们想要尝试的分箱数量。 binsrange [2,5,10,15,20,30] 3…

Domino 14中安装配置使用OnTime团队日历组件

大家好&#xff0c;才是真的好。 在9月底发布的Domino 14 EA3中&#xff0c;包含了OnTime团队日历组件。OnTime是一款日历协作功能应用&#xff0c;侧重于团队日历&#xff0c;功能侧重于协作&#xff0c;界面较为简洁、现代等。 Domino如今越来越多地集成进合作伙伴的解决方…

Android设计模式--原型模式

一&#xff0c;定义 原型模式就是用原型实例指定创建对象的种类&#xff0c;并通过拷贝这些原型创建新的对象 也就是说用户从一个实例中复制出一个内部属性一致的对象&#xff0c;这个被复制的对象就是原型。 原型模式多用于创建复杂的或者构造耗时的实例&#xff0c;因为这…

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

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

IntelliJ IDEA cmd和idea Terminal查看java版本不一致

参考&#xff1a;IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解决方案 1、idea清缓存重启 没用 2、删除缓存文件 没试 3、修改环境变量的顺序 没试 4、重启电脑 麻烦&#xff0c;没试 5、项目配置jdk7 没试 按照这个url配置了一个遍 https://blog.csdn…