当前位置:首页 > 牛客 > 牛客网230100题岛屿最大面积:深度优先搜索(DFS)算法解析

牛客网230100题岛屿最大面积:深度优先搜索(DFS)算法解析

2个月前 (07-31)

牛客网230100题岛屿最大面积:深度优先搜索(DFS)算法解析 牛客题解 深度优先搜索 图 深搜 DFS 递归 第1张

一、题目解读

本题要求在一个由0和1组成的二维网格中,计算岛屿的最大面积。岛屿由相邻的1(陆地)组成,相邻位置包括上下左右四个方向。网格中的0代表海洋,岛屿不可跨越海洋。需返回所有岛屿中面积最大的值。若网格为空,则返回0。

二、解题思路

采用深度优先搜索DFS算法。遍历网格每个位置,当遇到陆地(grid[i][j] == 1)时,启动DFS递归计算当前岛屿面积,同时标记已访问的陆地为2,避免重复计算。通过遍历所有陆地,记录最大面积值。关键在于利用递归遍历岛屿的连通块,并累加面积。

三、解题步骤

1. 初始化:若网格为空,直接返回0。记录网格行数(rows)和列数(cols),初始化最大面积max_area为0。

2. 遍历网格:双层循环遍历每个位置(i, j),若grid[i][j] == 1,调用dfs计算当前岛屿面积,更新max_area。

3. 递归计算面积(dfs):

○ 边界检查:若坐标越界或当前位置为海洋/已访问(grid[i][j]!= 1),返回0。

○ 标记已访问:将当前位置标记为2(避免重复计算)。

○ 递归向四周扩散:递归调用dfs计算上下左右四个方向的连通陆地面积,并累加。

○ 返回当前位置面积(1)+ 四周面积之和。

四、代码及注释

class Solution {
public:
    int maxAreaIsland(vector<vector<int>>& grid) {
        if (grid.empty()) return 0; // 空网格直接返回0
        int max_area = 0;          // 初始化最大面积
        rows = grid.size();        // 记录行数
        cols = grid[0].size();     // 记录列数

        for (int i = 0; i < rows; ++i) {  // 遍历行
            for (int j = 0; j < cols; ++j) { // 遍历列
                if (grid[i][j] == 1) { // 发现陆地,调用DFS
                    max_area = max(max_area, dfs(grid, i, j)); // 更新最大面积
                }
            }
        }
        return max_area;
    }

private:
    int rows, cols; // 全局变量记录行列数
    int dfs(vector<vector<int>>& grid, int i, int j) {
        // 边界 + 海洋/已访问检查
        if (i < 0 || j < 0 || i >= rows || j >= cols || grid[i][j]!= 1) 
            return 0;
        grid[i][j] = 2; // 标记已访问
        return 1 + dfs(grid, i+1, j) + dfs(grid, i-1, j) // 向下、向上递归
               + dfs(grid, i, j+1) + dfs(grid, i, j-1); // 向右、向左递归
    }
};

五、总结

本题通过DFS算法高效求解岛屿最大面积,核心在于递归遍历连通块并累加面积。使用全局变量存储行列数可减少函数参数传递开销,标记已访问位置避免重复计算。时间复杂度为O(MN),M和N为网格尺寸,空间复杂度为O(MN)(递归空间)。该解法适用于稀疏岛屿场景,能有效处理大规模网格问题。

原创内容 转载请注明出处

分享给朋友:

相关文章

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

力扣501题最优解:不用额外空间找出BST中的众数?这个解法让你大开眼界

题目解读‌:在二叉搜索树的世界里,每个节点都默默记录着自己的数值。现在我们需要找出这些数值中出现频率最高的那些数字,也就是所谓的"众数"。有趣的是,二叉搜索树本身具有左小右大的特性...

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

一、题目解读括号树问题(洛谷P5658)要求处理一个由括号序列转化的树结构:每个节点表示一个括号,'('为子节点,')'为父节点。题目给定一棵n个节点的树,需计算每个节...

牛客14496题解:括号最大深度问题(栈思想与代码优化)

牛客14496题解:括号最大深度问题(栈思想与代码优化)

一、题目解读牛客14496题要求计算给定括号字符串中的最大深度。例如,对于字符串 "(()())",最大深度为2。题目考察对括号嵌套结构的理解,以及如何通过编程找到最深嵌套层次。二...

力扣LCP41题解析:棋盘翻转算法优化与C++深度优先搜索策略

力扣LCP41题解析:棋盘翻转算法优化与C++深度优先搜索策略

一、题目解读力扣LCP41题要求玩家在给定棋盘中,通过翻转单个棋子(将'.'变为'X'),使其周围'X'连锁翻转'O',最终计算最多能翻...

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

牛客4432题解题全解析:矩阵快速幂优化楼梯攀登问题(附C++代码)

一、题目解读牛客4432题要求计算在n阶楼梯中,每次可爬1阶或2阶,共有多少种不同的攀登方式。该问题属于经典的动态规划类题目,需通过数学递推或矩阵乘法优化算法以应对较大数据规模。题目核心在于寻找高效计...

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

洛谷P1141题解:迷宫连通块问题的深度优先搜索算法与代码解析

一、题目解读洛谷P1141题目要求处理一个由字符构成的迷宫,其中相同字符形成连通块,不同字符构成分隔。题目需统计连通块数量及大小,并支持查询两点是否属于同一连通块。核心在于高效识别并标记迷宫中的连通区...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。