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
}