classSolution{int m,n;int[] dx ={0,0,-1,1};int[] dy ={-1,1,0,0};publicList<List<Integer>>pacificAtlantic(int[][] heights){
m = heights.length; n = heights[0].length;boolean[][] pac =newboolean[m][n];boolean[][] atl =newboolean[m][n];//判断大西洋的水能否流到某一位置for(int i =0; i < n; i++)dfs(heights,0,i,pac);for(int j =0; j < m; j++)dfs(heights,j,0,pac);//判断太平洋的水能否流到某一位置for(int i =0; i < m; i++)dfs(heights,i,n-1,atl);for(int j =0; j < n; j++)dfs(heights,m-1,j,atl);List<List<Integer>> ret =newArrayList<>();for(int i =0; i < m; i++)for(int j =0; j < n; j++){if(pac[i][j]&& atl[i][j]){List<Integer> tmp =newArrayList<>();
tmp.add(i); tmp.add(j);
ret.add(tmp);}}return ret;}//封装出来一套标记遍历privatevoiddfs(int[][] heights,int i,int j,boolean[][] vis){
vis[i][j]=true;for(int k =0; k <4; k++){int x = i + dx[k];int y = j + dy[k];if(x >=0&& x < m && y >=0&& y < n &&!vis[x][y]&& heights[x][y]>= heights[i][j]){dfs(heights,x,y,vis);}}}}