LeetCode 热题 100 | 图论(一)

本文介绍了如何用C++编程解决200岛屿数量问题,采用智障遍历法找出岛屿,以及如何处理2994腐烂橘子问题,通过仿层序遍历法模拟橘子污染过程。核心是利用循环结构遍历和更新二维数组中的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1  200. 岛屿数量

2  994. 腐烂的橘子

2.1  智障遍历法

2.2  仿层序遍历法


菜鸟做题,语言是 C++

1  200. 岛屿数量

解题思路:

  1. 遍历二维数组,寻找 “1”(若找到则岛屿数量 +1)
  2. 寻找与当前 “1” 直接或间接连接在一起的 “1”
  3. 将这些 “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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值