岛屿数量(NC109/考察次数Top41/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了岛屿数量(NC109/考察次数Top41/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个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
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 判断岛屿数量
     * @param grid char字符型vector<vector<>> 
     * @return int整型
     */
    int solve(vector<vector<char> >& grid) {
        // write code here
        int count = 0;
        for(int i=0; i<grid.size(); ++i)               //负责行遍历
        {
            for(int j=0; j<grid[0].size(); ++j)        //负责一行的每一列的遍历
            {
                if(grid[i][j]=='1')                    //碰到是1的,岛屿数量加1,然后处理一下
                {
                    isIland(grid, i, j);               //处理岛屿的函数
                    ++count;                           //数量++
                }
            }
        }
        return count;
    }
    
    //处理岛屿的函数,如果当前位置的值已经是0则返回,不是0则赋值为0,同时用处理岛屿的函数处理上下左右各位置
    void isIland(vector<vector<char>>& grid, int i, int j)
    {
        if(grid[i][j]=='0')           //找到0,才不需要继续使其上下左右都为0, 
            return;                   //注意递归调用一定要有结束递归的条件
        grid[i][j]='0';               //找到的不是0,则需要将其赋值为0,再继续判断其上下左右

        if(i-1>=0)                    //上
            isIland(grid, i-1, j);
        if(i+1<grid.size())           //下
            isIland(grid, i+1, j);
        if(j-1>=0)                    //左
            isIland(grid, i, j-1);
        if(j+1<grid[0].size())        //右
            isIland(grid, i, j+1);
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于岛屿数量(NC109/考察次数Top41/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

合并区间(NC37/考察次数Top57/难度中等)

合并区间(NC37/考察次数Top57/难度中等)

容器盛水问题(NC128/考察次数Top39/难度中等)

最长公共子串(NC127/考察次数Top22/难度中等)

排序算法(NC140/考察次数Top2/难度中等)

大数加法(NC1/考察次数Top20/难度中等)