public class Solution {
public List<int[]> pacificAtlantic(int[][] matrix) {
List<int[]> ret=new ArrayList<int[]>();
int m=matrix.length;
if(m==0)
return ret;
int n=matrix[0].length;
if(n==0)
return ret;
Queue<int[]> Qpacific=new LinkedList<int[]>();
Queue<int[]> Qatlantic=new LinkedList<int[]>();
boolean[][] pvisited=new boolean[m][n];
boolean[][] avisited=new boolean[m][n];
for(int i=0;i<m;i++)
{
Qpacific.offer(new int[]{i,0});
Qatlantic.offer(new int[]{i,n-1});
pvisited[i][0]=true;
avisited[i][n-1]=true;
}
for(int i=0;i<n;i++){
Qpacific.offer(new int[]{0,i});
Qatlantic.offer(new int[]{m-1,i});
pvisited[0][i]=true;
avisited[m-1][i]=true;
}
BFS(Qpacific,pvisited,matrix);
BFS(Qatlantic,avisited,matrix);
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
if(pvisited[i][j]&&avisited[i][j]){
ret.add(new int[]{i,j});
}
}
return ret;
}
private void BFS(Queue<int[]> q,boolean[][] visited,int[][] matrix){
int[][] dirs=new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
int m=matrix.length;
int n=matrix[0].length;
while(!q.isEmpty()){
int[] cur=q.poll();
for(int[] dir:dirs){
int x=dir[0]+cur[0];
int y=dir[1]+cur[1];
if(x<0||x>m-1||y<0||y>n-1||visited[x][y]||matrix[x][y]<matrix[cur[0]][cur[1]])
continue;
visited[x][y]=true;
q.offer(new int[]{x,y});
}
}
}
}
417. Pacific Atlantic Water Flow
最新推荐文章于 2019-12-17 19:29:53 发布