给定一个 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]] (上图中带括号的单元).
code:从中间向四周遍历。遍历每个元素判断其是否能同时到达太平洋和大西洋。超时
class Solution { private: bool inPacific; bool inAtlantic; vector<vector<bool>> visited; vector<int> nextX{1,-1,0,0}; vector<int> nextY{0,0,1,-1}; private: void pacificAtlanticCore(const vector<vector<int>>& matrix,int x,int y) { if(x<0||y<0) { inPacific=true; return ; } if(x>=matrix.size()||y>=matrix[0].size()) { inAtlantic=true; return ; } //visited[x][y]=true; for(int i=0;i<4;++i) { int newX=x+nextX[i]; int newY=y+nextY[i]; if(newX<0||newX>=matrix.size()||newY<0||newY>=matrix[0].size()) pacificAtlanticCore(matrix,newX,newY); else if(!visited[newX][newY]&&matrix[x][y]>=matrix[newX][newY]) { visited[newX][newY]=true; pacificAtlanticCore(matrix,newX,newY); } } //visited[x][y]=false; } public: vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) { if(matrix.empty()||matrix[0].empty()) return {}; vector<vector<int>> res; vector<bool> tmp(matrix[0].size(),false); for(int i=0;i<matrix.size();++i) { for(int j=0;j<matrix[0].size();++j) { visited.clear(); visited.resize(matrix.size(),tmp); inAtlantic=false; inPacific=false; pacificAtlanticCore(matrix,i,j); if(inPacific&&inAtlantic) res.push_back({i,j}); } } return res; } };
code1:从四周向中间遍历
class Solution { void dfs(const vector<vector<int>>& matrix,int x,int y,vector<vector<bool>>& visited) { if(x<0||x>=matrix.size()||y<0||y>=matrix[0].size()||visited[x][y]) return ; visited[x][y]=true; if(x>0&&matrix[x][y]<=matrix[x-1][y]) dfs(matrix,x-1,y,visited); if(x<matrix.size()-1&&matrix[x][y]<=matrix[x+1][y]) dfs(matrix,x+1,y,visited); if(y<matrix[0].size()-1&&matrix[x][y]<=matrix[x][y+1]) dfs(matrix,x,y+1,visited); if(y>0&&matrix[x][y]<=matrix[x][y-1]) dfs(matrix,x,y-1,visited); } public: vector<vector<int>> pacificAtlantic(vector<vector<int>>& matrix) { if(matrix.empty()||matrix[0].empty()) return {}; int row=matrix.size(); int col=matrix[0].size(); vector<vector<bool>> pacific(row,vector<bool>(col,false)); vector<vector<bool>> atlantic(row,vector<bool>(col,false)); for(int i=0;i<row;++i) { dfs(matrix,i,0,pacific); dfs(matrix,i,col-1,atlantic); } for(int j=0;j<col;++j) { dfs(matrix,0,j,pacific); dfs(matrix,row-1,j,atlantic); } vector<vector<int>> res; for(int i=0;i<row;++i) { for(int j=0;j<col;++j) { if(pacific[i][j]&&atlantic[i][j]) res.push_back({i,j}); } } return res; } };