Skip to content

Latest commit

 

History

History
69 lines (61 loc) · 1.88 KB

200. Number of Islands.md

File metadata and controls

69 lines (61 loc) · 1.88 KB

200. 岛屿数量

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3

解法一:

//时间复杂度O(n^2), 空间复杂度O(1)
class Solution {
public:
    void dfs(vector<vector<char>>& grid, int i, int j) {
        grid[i][j] = '0';
        int dx[] = { 0, -1, 1, 0 };
        int dy[] = { -1, 0, 0, 1 };
        for(int k = 0; k < 4; k++) {
            int nexti = i + dx[k], nextj = j + dy[k];
            if(nexti >= 0 && nexti < grid.size() &&
               nextj >= 0 && nextj < grid[0].size() &&
               grid[nexti][nextj] == '1')
               dfs(grid, nexti, nextj); 
        }
    }
    int numIslands(vector<vector<char>>& grid) {
        if(grid.empty()) return 0;
        int res = 0;
        for(int i = 0; i < grid.size(); i++) {
            for(int j = 0; j < grid[0].size(); j++) {
                if(grid[i][j] == '1') {
                    dfs(grid, i, j);
                    res++;
                }
            }
        }
        return res;
    }
};

解法一:

DFS。遍历二维数组中的所有元素,如果当前元素是‘1’,说明当前位置在某个小岛上,调用dfs(),该函数将当前所站的小岛清除(将连通区域的‘1’置‘0’)同时计数,直到遍历完成。

有副作用,会改变原二维数组。

2020/01/07 23:16