【LeetCode】BM57 岛屿数量

题目

【中等】【递归】BM57 岛屿数量

描述
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。
例如:
输入
[
[1,1,0,0,0],
[0,1,0,1,1],
[0,0,0,1,1],
[0,0,0,0,0],
[0,0,1,1,1]
]
对应的输出为3
(注:存储的01数据其实是字符’0’,‘1’)

思路

  • 目的是找到所有岛屿,每次遇到一个“1”,则将这个“1”置为“0”,并查询其四个方向是否为“1”(即进入子问题),如此将与其相邻的“1”全部置为“0”(等价于即将该岛“抹去”)。这样只需要遍历一边数组,逐次统计岛屿数量即可

代码

class Solution {
  public:
    /**
     * 判断岛屿数量
     * @param grid char字符型vector>
     * @return int整型
     */

    void recursion(vector<vector<char>>& grid, int i, int j, int n, int m) {
    	//将当前“1”置为“0”
        grid[i][j] = '0';
        //递归查询四个方向,若有“1”,则将其置零,注意判断边界
        if (i - 1 >= 0 && grid[i - 1][j] == '1')
            recursion(grid, i - 1, j, n, m);
        if (i + 1 < n && grid[i + 1][j] == '1')
            recursion(grid, i + 1, j, n, m);
        if (j - 1 >= 0 && grid[i][j - 1] == '1')
            recursion(grid, i, j - 1, n, m);
        if (j + 1 < m && grid[i][j + 1] == '1')
            recursion(grid, i, j + 1, n, m);
    }
    int solve(vector<vector<char> >& grid) {
        // write code here
        if(grid.size() == 0)
            return 0;
        int n = grid.size();
        int m = grid[0].size();
        int res = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < m; j++){
                if(grid[i][j] == '1'){
                    res += 1;					//岛屿数量++
                    recursion(grid, i, j, n, m); //将与这个1相邻的所有1清零
                }
            }
        }
        return res;
    }
};

笔记

你可能感兴趣的:(LeetCode,leetcode,算法,职场和发展)