leetcode417

DFS思路

 1 class Solution {
 2     private int m, n;
 3     private int[][] matrix;
 4     private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
 5 
 6     public List<int[]> pacificAtlantic(int[][] matrix) {
 7         List<int[]> ret = new ArrayList<>();
 8         if (matrix == null || matrix.length == 0) {
 9             return ret;
10         }
11 
12         m = matrix.length;
13         n = matrix[0].length;
14         this.matrix = matrix;
15         boolean[][] canReachP = new boolean[m][n];
16         boolean[][] canReachA = new boolean[m][n];
17 
18         for (int i = 0; i < m; i++) {
19             dfs(i, 0, canReachP);//从左边界(太平洋)开始,即第0列
20             dfs(i, n - 1, canReachA);//从右边界(大西洋)开始,即最后一列
21         }
22         for (int i = 0; i < n; i++) {
23             dfs(0, i, canReachP);//从上边界(太平洋)开始,即第0行
24             dfs(m - 1, i, canReachA);//从下边界(大西洋)开始,即最后一行
25         }
26 
27         for (int i = 0; i < m; i++) {
28             for (int j = 0; j < n; j++) {
29                 if (canReachP[i][j] && canReachA[i][j]) {//同时能从太平洋边界和大西洋边界达到的点(求交集)
30                     ret.add(new int[]{i, j});
31                 }
32             }
33         }
34 
35         return ret;
36     }
37 
38     private void dfs(int r, int c, boolean[][] canReach) {
39         if (canReach[r][c]) {
40             return;
41         }
42         canReach[r][c] = true;
43         for (int[] d : direction) {//遍历上下左右,四个方向
44             int nextR = d[0] + r;
45             int nextC = d[1] + c;
46             if (nextR < 0 || nextR >= m || nextC < 0 || nextC >= n//越界(非法)
47                     || matrix[r][c] > matrix[nextR][nextC]) {//从高处(边界)流向低处(中央区域)(非法)
48 
49                 continue;
50             }
51             dfs(nextR, nextC, canReach);
52         }
53     }
54 }

猜你喜欢

转载自www.cnblogs.com/asenyang/p/10992544.html