力扣-11.4-417
程序员文章站
2024-03-24 08:50:34
...
解析:从两个海洋逆向走,可以到达的进行标记,然后对比两个标记矩阵,都标记过的位置则是可以流向2个海洋的。
方法一:(深度优先)
class Solution {
public static void dfs(int i,int j,int[][] mark,int pre,int[][] matrix) {
int[][] directions= {{0,-1,},{0,1},{-1,0},{1,0}};
if(i<0 || j<0 || i==matrix.length || j==matrix[0].length || matrix[i][j]<pre || mark[i][j]==1) {
return;
}
mark[i][j]=1;
for(int index=0;index<4;index++) {
dfs(i+directions[index][0],j+directions[index][1],mark,matrix[i][j],matrix);
}
}
public List<List<Integer>> pacificAtlantic(int[][] matrix) {
List<List<Integer>> res=new LinkedList<List<Integer>>();
int row=matrix.length;
if(row==0) {
return res;
}
int col=matrix[0].length;
if(col==0) {
return res;
}
int[][] pac=new int[row][col];
int[][] alt=new int[row][col];
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
if(i==0 || j==0) {
dfs(i,j,pac,matrix[i][j],matrix);
}
if(i==row-1 || j==col-1) {
dfs(i,j,alt,matrix[i][j],matrix);
}
}
}
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
if(pac[i][j]==1 && alt[i][j]==1) {
res.add(Arrays.asList(i,j));
}
}
}
return res;
}
}
方法二:(广度优先)
class Solution {
public static void bfs(Queue<int[]> q,int[][] mark,int[][] matrix) {
while(!q.isEmpty()) {
int[] temp=q.poll();
int i=temp[0];
int j=temp[1];
mark[i][j]=1;
int[][] directions= {{0,-1},{0,1},{-1,0},{1,0}};
for(int index=0;index<4;index++) {
int nexti=i+directions[index][0],nextj=j+directions[index][1];
if(nexti>=0 && nextj>=0 && nexti<matrix.length && nextj<matrix[0].length && matrix[i][j]<=matrix[nexti][nextj] && mark[nexti][nextj]!=1) {
q.add(new int[] {nexti,nextj});
}
}
}
}
public List<List<Integer>> pacificAtlantic(int[][] matrix) {
List<List<Integer>> res=new LinkedList<List<Integer>>();
int row=matrix.length;
if(row==0) {
return res;
}
int col=matrix[0].length;
if(col==0) {
return res;
}
int[][] pac=new int[row][col];
int[][] alt=new int[row][col];
Queue<int[]> Q_p=new LinkedList<int[]>();
Queue<int[]> Q_a=new LinkedList<int[]>();
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
if(i==0 || j==0) {
Q_p.add(new int[] {i,j});
}
if(i==row-1 || j==col-1) {
Q_a.add(new int[] {i,j});
}
}
}
bfs(Q_p,pac,matrix);
bfs(Q_a,alt,matrix);
for(int i=0;i<row;i++) {
for(int j=0;j<col;j++) {
if(pac[i][j]==1 && alt[i][j]==1) {
res.add(Arrays.asList(i,j));
}
}
}
return res;
}
}
上一篇: APP自动化测试(二)-appium
下一篇: 异常处理流程(重点)