1. 程式人生 > >Leetcode 417.太平洋大西洋水流問題

Leetcode 417.太平洋大西洋水流問題

太平洋大西洋水流問題

給定一個 m x n 的非負整數矩陣來表示一片大陸上各個單元格的高度。"太平洋"處於大陸的左邊界和上邊界,而"大西洋"處於大陸的右邊界和下邊界。

規定水流只能按照上、下、左、右四個方向流動,且只能從高到低或者在同等高度上流動。

請找出那些水流既可以流動到"太平洋",又能流動到"大西洋"的陸地單元的座標。

   

提示:

  1. 輸出座標的順序不重要
  2. mn 都小於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 }