LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)
> ans; for(i = 0; i < m; ++i) { for(j = 0; j < n; ++j) { if(visited[i][j] && visited2[i][j])//访问过两次的 ans.push_back({ i,j}); } } return ans; }};
发布日期:2021-07-01 03:25:53
浏览次数:2
分类:技术文章
本文共 3185 字,大约阅读时间需要 10 分钟。
文章目录
1. 题目
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。
“太平洋”处于大陆的左边界和上边界,而“大西洋”处于大陆的右边界和下边界。规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到“太平洋”,又能流动到“大西洋”的陆地单元的坐标。
提示:输出坐标的顺序不重要m 和 n 都小于150 示例:给定下面的 5x5 矩阵: 太平洋 ~ ~ ~ ~ ~ ~ 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]] (上图中带括号的单元).
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pacific-atlantic-water-flow 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 逆向考虑,从两个大洋,往高处或等高的地方流
- 留到2次的地方为答案
2.1 BFS 广度优先搜索
class Solution { vector> dir = { { 1,0},{ 0,1},{ 0,-1},{ -1,0}};public: vector > pacificAtlantic(vector >& matrix) { if(matrix.empty() || matrix[0].empty()) return { }; int m = matrix.size(), n = matrix[0].size(), i, j, x, y, k, v; vector > visited(m, vector (n,false)); queue > q; for(i = 0; i < n; ++i)//加入太平洋的两条边 { q.push({ 0,i}); visited[0][i] = true; } for(i = 1; i < m; ++i)//加入太平洋的两条边 { q.push({ i,0}); visited[i][0] = true; } while(!q.empty()) { x = q.front()[0]; y = q.front()[1]; v = matrix[x][y]; q.pop(); for(k = 0; k < 4; ++k) { i = x + dir[k][0]; j = y + dir[k][1]; if(i>=0 && i =0 && j > visited2(m, vector (n,false)); for(i = 0; i < n; ++i)//加入大西洋的两条边 { q.push({ m-1,i}); visited2[m-1][i] = true; } for(i = 0; i < m-1; ++i)//加入大西洋的两条边 { q.push({ i,n-1}); visited2[i][n-1] = true; } while(!q.empty()) { x = q.front()[0]; y = q.front()[1]; v = matrix[x][y]; q.pop(); for(k = 0; k < 4; ++k) { i = x + dir[k][0]; j = y + dir[k][1]; if(i>=0 && i =0 && j
112 ms 18.7 MB
2.2 DFS 深度优先搜索
class Solution { vector> dir = { { 1,0},{ 0,1},{ 0,-1},{ -1,0}}; int m, n;public: vector > pacificAtlantic(vector >& matrix) { if(matrix.empty() || matrix[0].empty()) return { }; m = matrix.size(), n = matrix[0].size(); int i, j; vector > visited(m, vector (n,false)); for(i = 0; i < n; ++i) { if(!visited[0][i]) { visited[0][i] = true; dfs(0,i,visited,matrix); } } for(i = 1; i < m; ++i) { if(!visited[i][0]) { visited[i][0] = true; dfs(i,0,visited,matrix); } } vector > visited2(m, vector (n,false)); for(i = 0; i < n; ++i) { if(!visited2[m-1][i]) { visited2[m-1][i] = true; dfs(m-1,i,visited2,matrix); } } for(i = 0; i < m-1; ++i) { if(!visited2[i][n-1]) { visited2[i][n-1] = true; dfs(i,n-1,visited2,matrix); } } vector > ans; for(i = 0; i < m; ++i) { for(j = 0; j < n; ++j) { if(visited[i][j] && visited2[i][j]) ans.push_back({ i,j}); } } return ans; } void dfs(int x, int y, vector >& visited,vector >& matrix) { int i, j, v = matrix[x][y]; for(int k = 0; k < 4; ++k) { i = x + dir[k][0]; j = y + dir[k][1]; if(i>=0 && i =0 && j
100 ms 15.4 MB
转载地址:https://michael.blog.csdn.net/article/details/106208344 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
感谢大佬
[***.8.128.20]2024年04月17日 23时12分35秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MySQL进阶查询(SELECT 语句高级用法)
2019-04-30
Mysql 之主从复制
2019-04-30
【NLP学习笔记】中文分词(Word Segmentation,WS)
2019-04-30
对于时间复杂度的通俗理解
2019-04-30
如何输入多组数据并输出每组数据的和?
2019-04-30
行阶梯型矩阵
2019-04-30
MATLAB指定路径保存图片方法
2019-04-30
JAVA学习笔记6 - 数组
2019-04-30
【学习笔记】Android Activity
2019-04-30
location区段
2019-04-30
linux内存的寻址方式
2019-04-30
how2heap-double free
2019-04-30
how2heap-fastbin_dup_consolidate
2019-04-30
tf keras SimpleRNN源码解析
2019-04-30
MyBatisPlus简单入门(SpringBoot)
2019-04-30
攻防世界web进阶区web2详解
2019-04-30
xss-labs详解(上)1-10
2019-04-30
xss-labs详解(下)11-20
2019-04-30
攻防世界web进阶区ics-04详解
2019-04-30