DFSのアイデア
1 クラスソリューション{ 2 プライベート int型M、N。 3 プライベート INT [] []マトリックス。 4 民間 のint [] []方向= {{ 0、1 }、{ 0、 - 1 }、{ 1、0 }、{ - 1、0 }}。 5 6 パブリックリスト< INT []> pacificAtlantic(INT [] []行列){ 7 リスト< INT []> RET = 新規のArrayList <> (); 8 もし(行列は== NULL || matrix.length == 0 ){ 9 リターンRET。 10 } 11 12 M = matrix.length。 13 N =行列[ 0 ] .LENGTH。 14 この .matrix = マトリックス。 15個の ブール[] [] canReachP = 新しいブール値[M] [N]。 16個の ブール[] [] canReachA = 新しいブール値[M] [N]。 17 18 のために(int型 i = 0 ; iがmを<; iは++ ){ 19 DFS(I、0、canReachP); // 左の境界(パシフィック)から始まりから、すなわち、0番目の列 20は DFS(I、N - 1、canReachA); // 右境界(大西洋)が始まり、即ち、最後の列 21 } 22である ため(INT I = 0 ;私は<N-; I ++は){ 23が DFS(0、I、canReachP); // 境界(太平洋)、すなわち、0番目の行から開始 24 DFS(M - 1、I、canReachA) ; // 下限(大西洋)、すなわち、最後の行から 25 } 26である 27 のために(INT I = 0; Iがm <; I ++は){ 28 のために(INT J = 0 ; J <N-; J ++ ){ 29 IF(canReachP [I] [J] && canReachA [I] [J]){ // 同時にから太平洋境界点(の交点)は大西洋の境界達する 30 ret.add(新しい新規 のint [] {I、Jを}); 31である } 32 } 33である } 34である 35 リターンRET; 36 } 37 38である プライベート ボイド DFS(INT R&LT、INT Cブール[] [] canReach){ 39 IF(canReach [R&LT] [C]){ 40 リターンは、 41である } 42が canReach [R&LT] [C]が= trueに、 43である ため(INT [] D:方向){ // アップトラバースダウン4つの方向 44である INT nextR = D [ 0 ] + R&LT; 45 INT NEXTC = Dの[ 1 ] + C; 46は、 IF(nextR < 0 || nextR> = M || NEXTC < 0 || NEXTC> = N- // 境界(不正) 47 ||行列[R&LT] [C]>行列[nextR] [NEXTC]){ //(不正)(の境界)下部流(中央領域)の上方から 48 49は 続行; 50 } 51は 、DFS(nextR、NEXTC、canReach) 52である } 53である } 54です }