当前位置:首页 > 力扣 > 力扣3619题岛屿计数问题:深度优先搜索与模K判断

力扣3619题岛屿计数问题:深度优先搜索与模K判断

7个月前 (08-11)

力扣3619题岛屿计数问题:深度优先搜索与模K判断 力扣题解 深度优先搜索 深搜 DFS 递归 第1张

一、题目解读

力扣3619题要求在一个由0和正整数构成的二维网格中,统计所有岛屿的数量。岛屿由相邻的正整数单元格组成(上下左右相邻),且岛屿内所有单元格的值之和必须能被整数k整除。题目需要返回满足条件的岛屿数量。这道题结合了经典的岛屿计数问题与数值求和的额外约束,需要设计高效的遍历与判断逻辑。

二、解题思路

采用深度优先搜索DFS)策略,结合模K判断解决。核心思路如下:

1. 遍历网格每个单元格,若发现未访问的正整数单元格(陆地),启动DFS递归搜索。

2. 递归时累加当前岛屿的单元格值,并标记已访问。

3. 若岛屿总值sum对k取模为0,则计数+1。

4. 通过方向数组控制递归方向(上下左右),确保遍历所有相邻陆地。

此思路将岛屿搜索与数值条件判断紧密结合,避免了重复计算,同时满足题目要求。

三、解题步骤

1. 初始化参数:定义方向数组(上、右、下、左),确保递归遍历四个方向。

2. 外层遍历网格:使用双重循环检查每个单元格,若为陆地(>0)则执行DFS。

3. DFS递归搜索:

    边界检查:若越界或非陆地,终止递归。

    累加当前值并标记已访问。

    递归调用相邻方向,扩展岛屿范围。

4. 判断条件:若岛屿总值sum % k == 0,岛屿计数加1。

5. 最终返回总计数。

四、代码与注释

class Solution {
private:
    void dfs(vector<vector<int>>& grid, int i, int j, long long & sum, 
             const vector<pair<int, int>>& directions) {
        int m = grid.size(), n = grid[0].size();
        
        // 边界检查或当前单元格不是陆地
        if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] <= 0) {
            return;
        }
        
        // 累加当前单元格的值并标记为已访问
        sum += grid[i][j];
        grid[i][j] = -1;  // 标记为已访问
        
        // 向四个方向递归搜索
        for (const auto& dir : directions) {
            dfs(grid, i + dir.first, j + dir.second, sum, directions);
        }
    }
public:
    int countIslands(vector<vector<int>>& grid, int k) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size();
        int count = 0;
        
        // 定义方向数组:上、右、下、左
        vector<pair<int, int>> directions = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
        
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] > 0) {  // 发现新岛屿
                    long long sum = 0;
                    dfs(grid, i, j, sum, directions);
                    if (sum % k == 0) {
                        ++count;
                    }
                }
            }
        }
        return count;
    }
};

注释说明:代码通过DFS递归遍历岛屿,利用方向数组控制搜索路径,结合模K判断筛选符合条件的结果,实现高效解题。

五、总结

本文提供的解法利用深度优先搜索(DFS)递归遍历岛屿,并实时计算单元格总和,通过模K判断过滤符合条件的岛屿。该算法时间复杂度为O(MN),空间复杂度为O(MN)(递归),适用于中等规模的网格数据。若需优化,可考虑BFS并查集等其他算法路径。此外,代码结构清晰,注释详细,便于理解与复用。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

题目解读给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思...

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

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

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

牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)

牛客13279题解:利用递归与深度优先搜索计算树的最大高度(附完整代码)

一、题目解读牛客13279题要求计算给定树的最大高度。题目输入一棵以邻接表形式表示的树(节点从0开始编号),需要输出从根节点到最深叶节点的最长路径长度。树的结构由n个节点和n-1条边构成,保证为连通无...

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

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

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

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

力扣面试题02.05链表相加:虚拟头节点+迭代解法的详细解析

一、题目解读力扣面试题02.05要求将两个链表表示的整数相加,每个节点存储一位数字(逆序),结果同样以链表形式返回。例如,链表1为7→2→4,链表2为5→6→3,相加结果应为2→9→8→7。题目难点在...

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

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

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

发表评论

访客

看不清,换一张

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