太平洋大西洋水流问题
给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度。"太平洋"处于大陆的左边界和上边界,而"大西洋"处于大陆的右边界和下边界。
规定水流只能按照上、下、左、右四个方向流动,且只能从高到低或者在同等高度上流动。
请找出那些水流既可以流动到"太平洋",又能流动到"大西洋"的陆地单元的坐标。
提示:
- 输出坐标的顺序不重要
- m 和 n 都小于150
示例:
给定下面的 5x5 矩阵:
返回:
[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (上图中带括号的单元).
题解
- 做法:dfs+记忆化搜索
- 分两部分处理,第一个dfs处理能否到达太平洋,第二个dfs处理能否到达大西洋,我用path记录走过的路径,若为true
则可以到达,若为false则不可到达。(对每个点进行上下左右搜索)
1 import java.util.ArrayList; 2 import java.util.List; 3 4 class Solution { 5 public boolean[][] vis; 6 public boolean[][] vis1; 7 public int n,m; 8 public List<int[]> pacificAtlantic(int[][] matrix) { 9 if(matrix.length==0||matrix[0].length==0){ 10 return new ArrayList<int[]>(); 11 } 12 n=matrix.length; 13 m=matrix[0].length; 14 boolean[][] path=new boolean[n][m]; 15 boolean[][] path1=new boolean[n][m]; 16 vis=new boolean[n][m]; 17 vis1=new boolean[n][m]; 18 List<int[]> ans=new ArrayList<int[]>(); 19 for(int i = 0; i<n; ++i){ 20 for(int j = 0; j<m; ++j){ 21 if(dfs(i,j,path,matrix,matrix[i][j])&&dfs1(i,j,path1,matrix,matrix[i][j])){ 22 ans.add(new int[]{i,j}); 23 } 24 } 25 } 26 return ans; 27 } 28 public boolean dfs(int x, int y, boolean[][] path, int[][] matrix, int pre){ 29 if(x>=n||y>=m){ 30 return false; 31 } 32 if(x<0||y<0){ 33 return true; 34 } 35 if(matrix[x][y]>pre){ 36 return false; 37 } 38 if(vis[x][y]){ 39 return path[x][y]; 40 } 41 vis[x][y]=true; 42 path[x][y]=dfs(x-1,y,path,matrix,matrix[x][y])||dfs(x,y-1,path,matrix,matrix[x][y]) ||dfs(x+1,y,path,matrix,matrix[x][y])||dfs(x,y+1,path,matrix,matrix[x][y]); 43 vis[x][y]=false; 44 return path[x][y]; 45 } 46 public boolean dfs1(int x,int y,boolean[][] path,int[][] matrix,int pre){ 47 if(x<0||y<0){ 48 return false; 49 } 50 if(x>=n||y>=m){ 51 return true; 52 } 53 if(matrix[x][y]>pre){ 54 return false; 55 } 56 if(vis1[x][y]){ 57 return path[x][y]; 58 } 59 vis1[x][y]=true; 60 path[x][y]=dfs1(x-1,y,path,matrix,matrix[x][y])||dfs1(x,y-1,path,matrix,matrix[x][y]) ||dfs1(x+1,y,path,matrix,matrix[x][y])||dfs1(x,y+1,path,matrix,matrix[x][y]); 61 vis1[x][y]=false; 62 return path[x][y]; 63 } 64 }