LeetCode 200

https://leetcode.cn/problems/number-of-islands/description/

难度:中等

本题是一道图论 DFS 的题目。初始图中的陆地为 1,水为 0。当我们遍历陆地的时候,将遍历过的陆地改为 2,以防止重复访问。

遍历整张图,如果发现 grid[i][j] == 1,说明这是一块没被访问过的岛屿,dfs(i, j),岛屿数量加一。

时间复杂度:O(mn),其中 m 和 n 分别为 grid 的行数和列数。

空间复杂度:O(mn)。最坏情况下,递归需要 O(mn) 的栈空间。

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int m = grid.size(), n = grid[0].size();
        int ans = 0;
        auto dfs = [&](auto&& dfs, int i, int j) {
            if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] != '1') {
                return;
            }
            grid[i][j] = '2';
            dfs(dfs, i, j - 1);
            dfs(dfs, i, j + 1);
            dfs(dfs, i - 1, j);
            dfs(dfs, i + 1, j);
        };

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == '1') {
                    dfs(dfs, i, j);
                    ans++;
                }
            }
        }
        return ans;
    }
};