跳到主要内容

200. 岛屿数量

遍历搜索

  • 找到‘1’后,采用广度优先,将所有在同一岛屿上的‘1’标为‘0’,计数 +1
  • 重复以上步骤,直到矩阵内没有‘1’
  • 时间复杂度:大于 O(n); 空间复杂度:O(1)

遍历比较

  • 从左到右,从上到下遍历点

  • 若当前位置为 1,且其左,上位置点均为 0,则标为当前计数 +1

  • 若当前位置为 1,左,上位置均不为 0,则标记为较小数,将当前与上一行所有较大数同时变更为较小数,计数 -1

  • 时间复杂度:大于 O(n); 空间复杂度:O(1)

    class Solution {
    public:
    int numIslands(vector<vector<char>> &grid) {
    int islandCount = 0;
    int islandId = 0;
    int rowN = grid.size();
    int colN = grid.cbegin()->size();
    for (int i = 0; i < rowN; i++) {
    for (int j = 0; j < colN; j++) {
    if (grid[i][j] == '1') {
    auto top_value = i == 0 ? 0 : grid[i - 1][j] - '0';
    auto left_value = j == 0 ? 0 : grid[i][j - 1] - '0';
    if (top_value == 0 && left_value == 0) {
    grid[i][j] = ++islandId + '0';
    islandCount++;
    } else if (top_value == 0 || left_value == 0) {
    grid[i][j] = top_value == 0 ? left_value + '0' : top_value + '0';
    } else {
    auto cur_value = min(top_value, left_value);
    if (top_value != left_value) {
    replace(grid[i - 1].begin(), grid[i - 1].end(),
    max(top_value, left_value) + '0', cur_value + '0');
    replace(grid[i].begin(), grid[i].end(),
    max(top_value, left_value) + '0', cur_value + '0');
    islandCount--;
    }
    grid[i][j] = cur_value + '0';
    }
    }
    }
    }
    return islandCount;
    }
    };
  • 运行结果:未通过

    • 48/49 cases passed (N/A)
  • 原因:id 采用 char 存储,最大值为 127,当超过 127 时,id 会混乱,导致计算错误