1+ package  com .leetcode .arrays ;
2+ 
3+ import  static  org .junit .jupiter .api .Assertions .assertEquals ;
4+ 
5+ /** 
6+  * Level: Medium 
7+  * Link: https://leetcode.com/problems/number-of-islands/ 
8+  * Description: 
9+  * Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water 
10+  * and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid 
11+  * are all surrounded by water. 
12+  * <p> 
13+  * Example 1: 
14+  * Input: 
15+  * 11110 
16+  * 11010 
17+  * 11000 
18+  * 00000 
19+  * Output: 1 
20+  * <p> 
21+  * Example 2: 
22+  * Input: 
23+  * 11000 
24+  * 11000 
25+  * 00100 
26+  * 00011 
27+  * Output: 3 
28+  * 
29+  * @author rampatra 
30+  * @since 2019-08-07 
31+  */ 
32+ public  class  NumberOfIslands  {
33+ 
34+     /** 
35+      * The idea is simple and straightforward. Once we encounter land ('1' in grid) we drown the island or change the 
36+      * neighboring '1's to '0's. Therefore, the number of '1's we encounter, we can say that we have that many islands. 
37+      * <p> 
38+      * Time Complexity: O(n) 
39+      * Space Complexity: O(n) 
40+      * Runtime: <a href="https://leetcode.com/submissions/detail/249754904/">1 ms</a>. 
41+      * 
42+      * @param grid 
43+      * @return 
44+      */ 
45+     public  static  int  numIslands (char [][] grid ) {
46+         int  count  = 0 ;
47+ 
48+         for  (int  i  = 0 ; i  < grid .length ; i ++) {
49+             for  (int  j  = 0 ; j  < grid [0 ].length ; j ++) {
50+                 if  (grid [i ][j ] == '1' ) {
51+                     drownTheIsland (grid , i , j );
52+                     count ++;
53+                 }
54+             }
55+         }
56+ 
57+         return  count ;
58+     }
59+ 
60+     private  static  void  drownTheIsland (char [][] grid , int  i , int  j ) {
61+         if  (i  < 0  || j  < 0  || i  >= grid .length  || j  >= grid [0 ].length  || grid [i ][j ] == '0' ) {
62+             return ;
63+         }
64+ 
65+         grid [i ][j ] = '0' ;
66+ 
67+         drownTheIsland (grid , i , j  + 1 );
68+         drownTheIsland (grid , i , j  - 1 );
69+         drownTheIsland (grid , i  + 1 , j );
70+         drownTheIsland (grid , i  - 1 , j );
71+     }
72+ 
73+     public  static  void  main (String [] args ) {
74+         assertEquals (1 , numIslands (new  char [][]{
75+                 {'1' , '1' , '1' , '1' , '0' },
76+                 {'1' , '1' , '0' , '1' , '0' },
77+                 {'1' , '1' , '0' , '0' , '0' },
78+                 {'0' , '0' , '0' , '0' , '0' }
79+         }));
80+ 
81+         assertEquals (2 , numIslands (new  char [][]{
82+                 {'1' , '1' , '1' , '1' , '0' },
83+                 {'1' , '1' , '0' , '1' , '0' },
84+                 {'1' , '1' , '0' , '0' , '0' },
85+                 {'0' , '0' , '0' , '1' , '0' }
86+         }));
87+ 
88+         assertEquals (1 , numIslands (new  char [][]{
89+                 {'1' , '1' , '1' , '1' , '1' },
90+                 {'1' , '1' , '1' , '1' , '1' },
91+                 {'1' , '1' , '1' , '1' , '1' },
92+                 {'1' , '1' , '1' , '1' , '1' }
93+         }));
94+ 
95+         assertEquals (1 , numIslands (new  char [][]{
96+                 {'1' }
97+         }));
98+ 
99+         assertEquals (0 , numIslands (new  char [][]{
100+                 {'0' }
101+         }));
102+ 
103+         assertEquals (0 , numIslands (new  char [][]{
104+                 {}
105+         }));
106+     }
107+ }
0 commit comments