自学内容网 自学内容网

每日一练:岛屿数量

200. 岛屿数量 - 力扣(LeetCode)

题目要求:

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

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

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

示例 1:

输入:grid = [
  ["1","1","1","1","0"],
  ["1","1","0","1","0"],
  ["1","1","0","0","0"],
  ["0","0","0","0","0"]
]
输出:1

示例 2:

输入:grid = [
  ["1","1","0","0","0"],
  ["1","1","0","0","0"],
  ["0","0","1","0","0"],
  ["0","0","0","1","1"]
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

解法-1 感染 O(NM)

        创建一个数组tab,用来记录grid中的1是否已经有归属,如果是0表示没有归属;

        再写一个感染递归函数infect,只要发现没有归属的土地就以它为起点"感染"周围的土地,即让它们合并成一个岛屿;

class Solution {
    void infect(vector<vector<char>>& grid, vector<vector<int>>& tab, int i, int j)
    {
        if (i >= grid[0].size() || j >= grid.size())
            return;
        if (grid[j][i] == '0')
            return;
        else if(tab[j][i] == 0)
            tab[j][i] = 1;
        else        
            return;
        // 上下左右都要合并
        infect(grid, tab, i + 1, j);
        infect(grid, tab, i, j + 1);
        infect(grid, tab, i, j-1);
        infect(grid, tab, i-1, j );
    }
public:
    int numIslands(vector<vector<char>>& grid) {
        vector<vector<int>> tab;
        tab.resize(grid.size());
        for (auto& v : tab)
            v.resize(grid[0].size(), 0);
        int ret = 0;
        for (int i = 0; i < grid[0].size(); i++) {
            for (int j = 0; j < grid.size(); j++) {
                if (grid[j][i] == '1' && tab[j][i] == 0) { // 无归属土地
                    ret++;
                    infect(grid, tab, i, j); // 合并周围土地成一块岛屿
                }
            }
        }
        return ret;
    }
};

        空间优化:

        其实可以不用tab存储土地的情况,因为如果土地有归属我们可以用一个其他字符表示在原位置,例如我就用‘2’来表示有归属的土地:

class Solution {
    void infect(vector<vector<char>>& grid,int i, int j)
    {
        if (i >= grid[0].size() || j >= grid.size())
            return;
        if (grid[j][i] == '1') // 无归属土地
            grid[j][i] = '2'; // 标记为有归属
        else        
            return;
        infect(grid, i + 1, j);
        infect(grid, i, j + 1);
        infect(grid, i, j-1);
        infect(grid, i-1, j );
    }
public:
    int numIslands(vector<vector<char>>& grid) {
        int ret = 0;
        for (int i = 0; i < grid[0].size(); i++) {
            for (int j = 0; j < grid.size(); j++) {
                if (grid[j][i] == '1') { // 无归属土地
                    ret++;
                    infect(grid, i, j);
                }
            }
        }
        return ret;
    }
};


原文地址:https://blog.csdn.net/2303_78095330/article/details/142637516

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!