1
1
package com .fishercoder .solutions ;
2
2
3
3
import java .util .ArrayList ;
4
+ import java .util .Arrays ;
5
+ import java .util .LinkedList ;
4
6
import java .util .List ;
7
+ import java .util .Queue ;
5
8
6
9
public class _417 {
7
10
public static class Solution1 {
@@ -57,4 +60,64 @@ void dfs(int[][] matrix, boolean[][] visited, int height, int x, int y) {
57
60
}
58
61
}
59
62
63
+ public static class Solution2 {
64
+ public List <List <Integer >> pacificAtlantic (int [][] matrix ) {
65
+ List <List <Integer >> result = new ArrayList <>();
66
+ if (matrix == null || matrix .length == 0 || matrix [0 ].length == 0 ) {
67
+ return result ;
68
+ }
69
+ int m = matrix .length ;
70
+ int n = matrix [0 ].length ;
71
+ for (int i = 0 ; i < m ; i ++) {
72
+ for (int j = 0 ; j < n ; j ++) {
73
+ boolean [] touchesPacificAndAtlantic = new boolean [2 ];
74
+ update (i , j , m , n , touchesPacificAndAtlantic );
75
+ Queue <int []> queue = new LinkedList <>();
76
+ boolean [][] visited = new boolean [m ][n ];
77
+ visited [i ][j ] = true ;
78
+ queue .offer (new int []{i , j });
79
+ if (bfs (matrix , m , n , touchesPacificAndAtlantic , queue , visited )) {
80
+ result .add (new ArrayList <>(Arrays .asList (i , j )));
81
+ }
82
+ }
83
+ }
84
+ return result ;
85
+ }
86
+
87
+ private void update (int i , int j , int m , int n , boolean [] touchesPacificAndAtlantic ) {
88
+ if (i == 0 || j == 0 ) {
89
+ touchesPacificAndAtlantic [0 ] = true ;
90
+ }
91
+ if (i == m - 1 || j == n - 1 ) {
92
+ touchesPacificAndAtlantic [1 ] = true ;
93
+ }
94
+ }
95
+
96
+ private boolean bfs (int [][] matrix , int m , int n , boolean [] touchesPacificAndAtlantic , Queue <int []> queue , boolean [][] visited ) {
97
+ if (touchesPacificAndAtlantic [0 ] && touchesPacificAndAtlantic [1 ]) {
98
+ return true ;
99
+ }
100
+ int [] directions = new int []{0 , 1 , 0 , -1 , 0 };
101
+ while (!queue .isEmpty ()) {
102
+ int size = queue .size ();
103
+ for (int k = 0 ; k < size ; k ++) {
104
+ int [] curr = queue .poll ();
105
+ for (int p = 0 ; p < directions .length - 1 ; p ++) {
106
+ int newx = curr [0 ] + directions [p ];
107
+ int newy = curr [1 ] + directions [p + 1 ];
108
+ if (newx >= 0 && newx < m && newy >= 0 && newy < n && matrix [newx ][newy ] <= matrix [curr [0 ]][curr [1 ]] && !visited [newx ][newy ]) {
109
+ visited [newx ][newy ] = true ;
110
+ queue .offer (new int []{newx , newy });
111
+ update (newx , newy , m , n , touchesPacificAndAtlantic );
112
+ if (touchesPacificAndAtlantic [0 ] && touchesPacificAndAtlantic [1 ]) {
113
+ return true ;
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return false ;
120
+ }
121
+ }
122
+
60
123
}
0 commit comments