leetcode417

DFSのアイデア

1  クラスソリューション{
 2      プライベート int型M、N。
3      プライベート INT [] []マトリックス。
4      民間 のint [] []方向= {{ 01 }、{ 0、 - 1 }、{ 10 }、{ - 10 }}。
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です }

 

おすすめ

転載: www.cnblogs.com/asenyang/p/10992544.html