zoukankan      html  css  js  c++  java
  • [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 };
  • 相关阅读:
    Dev中出现Error 0: 操作成功完成。
    找出一个二维数组中的鞍点,即该位置上的元素在该行上最大、在该列上最小。也可能没有没有鞍点。
    oracle 日常删除多余数据
    java程序练习:输入数字转换成中文输出(金额相关)
    linux压缩和解压文件命令
    一篇文章搞定Git——Git代码管理及使用规范
    读书心得(1)-20191108
    回表查询的说明
    Java 8新特性解读
    java-try catch中return在finally之前 还是之后执行
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4596231.html
Copyright © 2011-2022 走看看