文章目录

  • 1. 题目
  • 2. 解题
    • 2.1 BFS 广度优先搜索
    • 2.2 DFS 深度优先搜索

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<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};
public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {if(matrix.empty() || matrix[0].empty())return {};int m = matrix.size(), n = matrix[0].size(), i, j, x, y, k, v;vector<vector<bool>> visited(m, vector<bool>(n,false));queue<vector<int>> 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<m && j>=0 && j<n && !visited[i][j] && v <= matrix[i][j]){q.push({i,j});visited[i][j] = true;}}}vector<vector<bool>> visited2(m, vector<bool>(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<m && j>=0 && j<n && !visited2[i][j] && v <= matrix[i][j]){q.push({i,j});visited2[i][j] = true;}}}vector<vector<int>> 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;}
};

112 ms 18.7 MB

2.2 DFS 深度优先搜索

class Solution {vector<vector<int>> dir = {{1,0},{0,1},{0,-1},{-1,0}};int m, n;
public:vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) {if(matrix.empty() || matrix[0].empty())return {};m = matrix.size(), n = matrix[0].size();int i, j;vector<vector<bool>> visited(m, vector<bool>(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<vector<bool>> visited2(m, vector<bool>(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<vector<int>> 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<vector<bool>>& visited,vector<vector<int>>& 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<m && j>=0 && j<n && !visited[i][j] && v <= matrix[i][j]){visited[i][j] = true;dfs(i, j, visited, matrix);}}  }
};

100 ms 15.4 MB

LeetCode 417. 太平洋大西洋水流问题(BFS/DFS)相关推荐

  1. LeetCode 417. 太平洋大西洋水流问题--BFS

    太平洋大西洋水流问题 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下 ...

  2. LeetCode 417. 太平洋大西洋水流问题 JAVA dfs

    给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下边界. 规定水流只能按 ...

  3. LeetCode 417. 太平洋大西洋水流问题【dfs】

    题目描述 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下边界. 规定 ...

  4. LeetCode 417.太平洋大西洋水流问题

    LeetCode 417.太平洋大西洋水流问题 有一个 m × n 的长方形岛屿,与 太平洋 和 大西洋 相邻. "太平洋" 处于大陆的左边界和上边界,而 "大西洋&qu ...

  5. 417. 太平洋大西洋水流问题(DFS)

    417. 太平洋大西洋水流问题 题目 解题思路 代码 题目 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而" ...

  6. Java实现 LeetCode 417 太平洋大西洋水流问题

    417. 太平洋大西洋水流问题 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的 ...

  7. leetcode 417. Pacific Atlantic Water Flow | 417. 太平洋大西洋水流问题(DFS,经典“感染”思路)

    题目 https://leetcode.com/problems/pacific-atlantic-water-flow/ 题解 一开始的错误思路:(区分"主动"与"被动 ...

  8. LeetCode 417 太平洋大西洋水流问题

    题目描述 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左 边界和上边界,而"大西洋"处于大陆的右边界和下边界.规定 ...

  9. 417. 太平洋大西洋水流问题(medium) -力扣(leetCode)逆流而上,JS图的深度优先遍历算法

    ⚡️417. 太平洋大西洋水流问题⚡️ 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处 ...

最新文章

  1. Mysql主主复制架构配置
  2. IT界程序员几大恶习能立即让你变穷,你有吗?
  3. 视图计算背后的技术架构思考
  4. 前端学习(2237):react实现疫情数据
  5. 四、Python-元组
  6. 随机密码生成python_让“全家福”更加随机 —— 自动生成照片布局之Python实现...
  7. iptables的应用
  8. MOSS自带SPDatePickerControl控件的使用
  9. 软件开发报价的计算方法
  10. 8086CPU时序概念
  11. 人像美颜美妆算法入门必备
  12. 最新的省市区三级地区MySQL数据库,附带获取方法
  13. JS时间增加2个小时
  14. Idea导入的项目不能运行
  15. html canvas 遮罩蒙版,canvas生成遮罩图片
  16. CentOS7 修改Swap大小
  17. [BZOJ1776] [Usaco2010 Hol]cowpol 奶牛政坛
  18. 国内云建设普遍缺失的一环:云管理平台
  19. 【QCM2150】WCN3680 WFA WPA3 STA 5.6.1测试失败
  20. windows下通过关键字批量删除远程k8s下deployment及pods

热门文章

  1. Django 部署基础【使用 Nginx + uWSGI 的方式来部署来 Django】
  2. python逐行读取txt写入excel_用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)...
  3. 数字信号处理的fpga实现_FPGA数字信号处理:通信类I/Q信号及产生
  4. Machine Learning(Stanford)| 斯坦福大学机(吴恩达)器学习笔记【汇总】
  5. 多线程的那点儿事(之读写锁)
  6. C++ Handle(句柄) part1
  7. 嵌入式面试中常见的编程题目
  8. LeetCode27——Remove Element(移除数组中指定的元素)
  9. python day15
  10. 数据压缩 第二次作业