这题考点在于需要设置两个visited数组
dfs 与bfs不同之处在于使调用符合题意的自己, 而bfs是遍历符合条件的兄弟, 用Queue
public class Solution {
int[][] directions = new int[][]{{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public List<int[]> pacificAtlantic(int[][] matrix) {
List<int[]> res = new ArrayList<int[]>();
if (matrix==null || matrix.length==0 || matrix[0].length==0) return res;
int n = matrix.length, m = matrix[0].length;
boolean[][] pVisited = new boolean[n][m];
boolean[][] aVisited = new boolean[n][m];
for (int i=0; i<n; i++) {
//pacific
dfs(matrix, i, 0, pVisited);
//atlatic
dfs(matrix, i, m-1, aVisited);
}
for (int j=0; j<m; j++) {
//pacific
dfs(matrix, 0, j, pVisited);
//atlatic
dfs(matrix, n-1, j, aVisited);
}
for (int i=0; i<n; i++) {
for (int j=0; j<m; j++) {
if (pVisited[i][j] && aVisited[i][j])
res.add(new int[]{i, j});
}
}
return res;
}
public void dfs(int[][] matrix, int i, int j, boolean[][] visited) {
int n = matrix.length, m = matrix[0].length;
visited[i][j] = true;
for (int[] dir : directions) {
int row = dir[0] + i;
int col = dir[1] + j;
if (row>=0 && row<n && col>=0 && col<m && !visited[row][col] && matrix[i][j]<=matrix[row][col])
dfs(matrix, row, col, visited);
}
}
}
BFS
当 if(pacific[i][j] && atlantic[i][j]) 时才满足题意
public class Solution {
int[][]dir = new int[][]{{1,0},{-1,0},{0,1},{0,-1}};
public List<int[]> pacificAtlantic(int[][] matrix) {
List<int[]> res = new LinkedList<>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
return res;
}
int n = matrix.length, m = matrix[0].length;
//One visited map for each ocean
boolean[][] pacific = new boolean[n][m];
boolean[][] atlantic = new boolean[n][m];
Queue<int[]> pQueue = new LinkedList<>();
Queue<int[]> aQueue = new LinkedList<>();
for(int i=0; i<n; i++){ //Vertical border
pQueue.offer(new int[]{i, 0});
aQueue.offer(new int[]{i, m-1});
pacific[i][0] = true;
atlantic[i][m-1] = true;
}
for(int i=0; i<m; i++){ //Horizontal border
pQueue.offer(new int[]{0, i});
aQueue.offer(new int[]{n-1, i});
pacific[0][i] = true;
atlantic[n-1][i] = true;
}
bfs(matrix, pQueue, pacific);
bfs(matrix, aQueue, atlantic);
for(int i=0; i<n; i++){
for(int j=0; j<m; j++){
if(pacific[i][j] && atlantic[i][j])
res.add(new int[]{i,j});
}
}
return res;
}
public void bfs(int[][]matrix, Queue<int[]> queue, boolean[][]visited){
int n = matrix.length, m = matrix[0].length;
while(!queue.isEmpty()){
int[] cur = queue.poll();
for(int[] d:dir){
int x = cur[0]+d[0];
int y = cur[1]+d[1];
if(x<0 || x>=n || y<0 || y>=m || visited[x][y] || matrix[x][y] < matrix[cur[0]][cur[1]]){
continue;
}
visited[x][y] = true;
queue.offer(new int[]{x, y});
}
}
}
}
417. Pacific Atlantic Water Flow
原文:http://www.cnblogs.com/apanda009/p/7287418.html