怎么把网站做成自适应,网址如何下载视频,搜索引擎优化分析,生鲜配送网站建设文章目录1. 题目2. 解题2.1 BFS 广度优先搜索2.2 DFS 深度优先搜索1. 题目
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。 “太平洋”处于大陆的左边界和上边界#xff0c;而“大西洋”处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方…
文章目录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 {vectorvectorint dir {{1,0},{0,1},{0,-1},{-1,0}};
public:vectorvectorint pacificAtlantic(vectorvectorint matrix) {if(matrix.empty() || matrix[0].empty())return {};int m matrix.size(), n matrix[0].size(), i, j, x, y, k, v;vectorvectorbool visited(m, vectorbool(n,false));queuevectorint 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(i0 im j0 jn !visited[i][j] v matrix[i][j]){q.push({i,j});visited[i][j] true;}}}vectorvectorbool visited2(m, vectorbool(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(i0 im j0 jn !visited2[i][j] v matrix[i][j]){q.push({i,j});visited2[i][j] true;}}}vectorvectorint 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 {vectorvectorint dir {{1,0},{0,1},{0,-1},{-1,0}};int m, n;
public:vectorvectorint pacificAtlantic(vectorvectorint matrix) {if(matrix.empty() || matrix[0].empty())return {};m matrix.size(), n matrix[0].size();int i, j;vectorvectorbool visited(m, vectorbool(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);}}vectorvectorbool visited2(m, vectorbool(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);}}vectorvectorint 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, vectorvectorbool visited,vectorvectorint 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(i0 im j0 jn !visited[i][j] v matrix[i][j]){visited[i][j] true;dfs(i, j, visited, matrix);}} }
};100 ms 15.4 MB