200. 岛屿数量

岛屿数量

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

问题分析

连通块个数,dfs或者bfs均可。

法一、dfs

class Solution {
public:
    int xx, yy;
    vector<vector<int>> st;
    int res = 0;
    int nx[4] = {-1, 0, 1, 0};
    int ny[4] = {0, 1, 0, -1};
    void dfs(int x, int y, vector<vector<char>>& grid) {
        if (x > xx-1 || y > yy-1 || x < 0 || y < 0) { // 三重判断:撞墙、走过、能走
            return ;
        }
        if (st[x][y] == 1) {return ;}
        if (grid[x][y] == '0') {return ;}
        st[x][y] = 1;
        for (int i = 0; i < 4; i++) {
            dfs(x+nx[i], y+ny[i], grid);
        }
    }

    int numIslands(vector<vector<char>>& grid) {
        xx = grid.size(); yy = grid[0].size();
        st = vector<vector<int>>(xx, vector<int>(yy, 0));
        for (int i = 0; i < xx; i++) {
            for (int j = 0; j < yy; j++) {
                if (grid[i][j] == '1' && st[i][j] == 0) {
                    dfs(i, j, grid);
                    res++;
                }
            }
        }
        return res;
    }
};

法二、bfs

class Solution {
public:
    int xx, yy;
    vector<vector<int>> st;
    int res = 0;
    int nx[4] = {-1, 0, 1, 0};
    int ny[4] = {0, 1, 0, -1};
    typedef pair<int, int> PII;
    queue<PII> q;
    void bfs(int x, int y, vector<vector<char>>& grid) {
        q.push(make_pair(x, y));
        st[x][y] = 1;
        while(!q.empty()) {
            PII t = q.front();
            q.pop();
            for (int i = 0; i < 4; i++) {
                int a = t.first + nx[i];
                int b = t.second + ny[i];
                if (a > xx-1 || b > yy-1 || a < 0 || b < 0) {
                    continue;
                } if (grid[a][b] == '0') {
                    continue;
                } if (st[a][b] == 1) {
                    continue;
                }
                q.push(make_pair(a, b));
                st[a][b] = 1; // 要在入队时候标记,而不是出队,否则会超时(同一个元素多次入队)
            }
        }
    }

    int numIslands(vector<vector<char>>& grid) {
        xx = grid.size(); yy = grid[0].size();
        st = vector<vector<int>>(xx, vector<int>(yy, 0));
        for (int i = 0; i < xx; i++) {
            for (int j = 0; j < yy; j++) {
                if (grid[i][j] == '1' && st[i][j] == 0) {
                    bfs(i, j, grid);
                    res++;
                }
            }
        }
        return res;
    }
};
posted @   saulstavo  阅读(0)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示