[LeetCode] Number of Islands

This is a typical problem about searching. In fact, you can use either BFS or DFS for it. Personally, I use BFS because I think it is more intuitive and easy to implement.

The idea is fairly simple. We maintain another 2-dimensional vector visited to mark whether the corresponding position in grid has been visited and a variable count for the number of islands (initialized to be 0). Then we visit grid from left to right and top to bottom. Each time when we see a non-visited 1 in grid, we add the number of islands by 1 and mark all the connected 4-neighbors (BFS is applied here to get neighbors, neighbors of neighbors, neighbors of neighbors of neighbors, ...) of the non-visited 1 (including itself) as visited.

Note that a lot of the solutions in the discussion forum directly changes 1 in grid to 0 instead of using another 2-dimensional vector visited. However, I personally prefer to keep the input unchanged in a function with a return value.

The code is as follows.

 1 class Solution {
 2 public:
 3     int numIslands(vector<vector<char>>& grid) {
 4         if (grid.empty()) return 0;
 5         int m = grid.size(), n = grid[0].size();
 6         vector<vector<bool> > visited(m, vector<bool> (n, false));
 7         int count = 0;
 8         for (int i = 0; i < m; i++) {
 9             for (int j = 0; j < n; j++) {
10                 if (grid[i][j] == '1' && !visited[i][j]){
11                     count++;
12                     markIslands(grid, visited, i, j);
13                 }
14             }
15         }
16         return count;
17     }
18 private:
19     void markIslands(vector<vector<char> >& grid, vector<vector<bool> >& visited, int row, int col) {
20         visited[row][col] = true;
21         if (row - 1 >= 0 && grid[row - 1][col] == '1' && !visited[row - 1][col])
22             markIslands(grid, visited, row - 1, col);
23         if (row + 1 < grid.size() && grid[row + 1][col] == '1' && !visited[row + 1][col])
24             markIslands(grid, visited, row + 1, col);
25         if (col - 1 >= 0 && grid[row][col - 1] == '1' && !visited[row][col - 1])
26             markIslands(grid, visited, row, col - 1);
27         if (col + 1 < grid[0].size() && grid[row][col + 1] == '1' && !visited[row][col + 1])
28             markIslands(grid, visited, row, col + 1);
29     }
30 };

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值