目录
菜鸟做题,语言是 C++
1 200. 岛屿数量
解题思路:
- 遍历二维数组,寻找 “1”(若找到则岛屿数量 +1)
- 寻找与当前 “1” 直接或间接连接在一起的 “1”
- 将这些 “1” 置为 “0”,再寻找下一个 “1”
思路说明图:
如步骤 1 所示,我们找到 “1”(红框内部),它可以作为一个岛屿的开头。接下来,我们寻找与这个 “1” 直接或间接连接在一起的 “1”,如步骤 2 所示。这一坨 “1”(红框内部)构成一个岛屿。
直接连接 是指上下左右四个方向,斜对角方向的不算。
除此之外,为了避免我们下一次寻找 “1” 时,把这座岛屿内部的 “1” 视为下一个岛屿的开头,我们要将这些 “1” 置为 “0” 。
我们是对整个二维数组进行遍历的,若不在遍历完一座岛屿后将 “1” 置为 “0”,那么这座岛屿除开头之外的 “1” 会被误认为是下一座岛屿的开头。
具体代码:
① Find “1”:在二维数组中寻找 “1”,作为岛屿的开头。
for (int i = 0; i < nr; ++i) {
for (int j = 0; j < nc; ++j) {
if (grid[i][j] == '1') {
++count;
helper(grid, i, j);
}
}
}
nr 是二维数组的行数,nc 是二维数组的列数。一旦找到 “1” 就 ++count,即认为找到了一座新的岛屿。同时,使用 helper 函数去寻找与当前 “1” 直接或间接连接在一起的 “1” 。
② Find Island:寻找与当前 “1” 直接或间接连接在一起的 “1”,它们构成一座岛屿。
void helper(vector<vector<char>>& grid, int r, int c) {
int nr = grid.size();
int nc = grid[0].size();
grid[r][c] = '0';
if (r - 1 >= 0 && grid[r - 1][c] == '1') helper(grid, r - 1, c);
if (r + 1 < nr && grid[r + 1][c] == '1') helper(grid, r + 1, c);
if (c - 1 >= 0 && grid[r][c - 1] == '1') helper(grid, r, c - 1);
if (c + 1 < nc && grid[r][c + 1] == '1') helper(grid, r, c + 1);
}
这四个 if 其实就是做上下左右四个方向的边界判断,同时判断当前 “1” 的邻居是不是 “1” 。若找到相邻的 “1”,那么再递归寻找与相邻的 “1” 直接或间接连接在一起的 “1” 。
class Solution {
public:
void helper(vector<vector<char>>& grid, int r, int c) {
int nr = grid.size