C++实现LeetCode(200.岛屿的数量)

 更新时间:2021年07月27日 15:36:03   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(200.岛屿的数量),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 200. Number of Islands 岛屿的数量

Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.

Example 1:

Input:
11110
11010
11000
00000

Output: 1

Example 2:

Input:
11000
11000
00100
00011

Output: 3

这道求岛屿数量的题的本质是求矩阵中连续区域的个数,很容易想到需要用深度优先搜索 DFS 来解,我们需要建立一个 visited 数组用来记录某个位置是否被访问过,对于一个为 ‘1' 且未被访问过的位置,递归进入其上下左右位置上为 ‘1' 的数,将其 visited 对应值赋为 true,继续进入其所有相连的邻位置,这样可以将这个连通区域所有的数找出来,并将其对应的 visited 中的值赋 true,找完相邻区域后,将结果 res 自增1,然后再继续找下一个为 ‘1' 且未被访问过的位置,以此类推直至遍历完整个原数组即可得到最终结果,代码如下:

解法一:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size(), res = 0;
        vector<vector<bool>> visited(m, vector<bool>(n));
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == '0' || visited[i][j]) continue;
                helper(grid, visited, i, j);
                ++res;
            }
        }
        return res;
    }
    void helper(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {
        if (x < 0 || x >= grid.size() || y < 0 || y >= grid[0].size() || grid[x][y] == '0' || visited[x][y]) return;
        visited[x][y] = true;
        helper(grid, visited, x - 1, y);
        helper(grid, visited, x + 1, y);
        helper(grid, visited, x, y - 1);
        helper(grid, visited, x, y + 1);
    }
};

当然,这种类似迷宫遍历的题目 DFS 和 BFS 两对好基友肯定是形影不离的,那么 BFS 搞起。其实也很简单,就是在遍历到 ‘1' 的时候,且该位置没有被访问过,那么就调用一个 BFS 即可,借助队列 queue 来实现,现将当前位置加入队列,然后进行 while 循环,将队首元素提取出来,并遍历其周围四个位置,若没有越界的话,就将 visited 中该邻居位置标记为 true,并将其加入队列中等待下次遍历即可,参见代码如下:

解法二:

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if (grid.empty() || grid[0].empty()) return 0;
        int m = grid.size(), n = grid[0].size(), res = 0;
        vector<vector<bool>> visited(m, vector<bool>(n));
        vector<int> dirX{-1, 0, 1, 0}, dirY{0, 1, 0, -1};
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (grid[i][j] == '0' || visited[i][j]) continue;
                ++res;
                queue<int> q{{i * n + j}};
                while (!q.empty()) {
                    int t = q.front(); q.pop();
                    for (int k = 0; k < 4; ++k) {
                        int x = t / n + dirX[k], y = t % n + dirY[k];
                        if (x < 0 || x >= m || y < 0 || y >= n || grid[x][y] == '0' || visited[x][y]) continue;
                        visited[x][y] = true;
                        q.push(x * n + y);
                    }
                }
            }
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/200

类似题目:

Number of Islands II

Surrounded Regions

Walls and Gates

Number of Connected Components in an Undirected Graph 

Number of Distinct Islands 

Max Area of Island

参考资料:

https://leetcode.com/problems/number-of-islands/

https://leetcode.com/problems/number-of-islands/discuss/56589/C%2B%2B-BFSDFS

https://leetcode.com/problems/number-of-islands/discuss/56359/Very-concise-Java-AC-solution

到此这篇关于C++实现LeetCode(200.岛屿的数量)的文章就介绍到这了,更多相关C++实现岛屿的数量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++函数模板与类模板相同与不同介绍

    C++函数模板与类模板相同与不同介绍

    C++语言的模板技术包括函数模板和类模板,模板技术是一种代码重用技术,函数和类是C++语言中两种主要的重用代码形式,这篇文章主要介绍了C++函数模板和类模板,需要的朋友可以参考下
    2022-08-08
  • C语言实现静态版通讯录的示例代码

    C语言实现静态版通讯录的示例代码

    这篇文章主要为大家详细介绍了如何利用C语言实现一个简单的静态版通讯录,文中的示例代码讲解详细,对我们学习C语言有一定帮助,需要的可以参考一下
    2022-08-08
  • OpenCV 轮廓周围绘制矩形框和圆形框的方法

    OpenCV 轮廓周围绘制矩形框和圆形框的方法

    这篇文章主要介绍了OpenCV 轮廓周围绘制矩形框和圆形框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • 使用C语言实现扫雷游戏

    使用C语言实现扫雷游戏

    这篇文章主要为大家详细介绍了使用C语言实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C++中两种字符串定义方式和区别介绍

    C++中两种字符串定义方式和区别介绍

    大家好,本篇文章主要讲的是C++中两种字符串定义方式和区别介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • C++中求组合数的各种方法总结详解

    C++中求组合数的各种方法总结详解

    本篇文章是对C++中的求组合数的各种方法进行了详细的介绍。需要的朋友参考下
    2013-05-05
  • C++ vector的介绍及常见功能实现

    C++ vector的介绍及常见功能实现

    这篇文章主要介绍了C++ vector的介绍及模拟实现,vector在实际中非常的重要,但在实际中我们只要熟悉常见的接口就可以了,最重要的是理解他的底层原理,要能够自己模拟实现出一个简单的vector,本文结合示例代码给大家详细介绍,需要的朋友可以参考下
    2023-05-05
  • 深入解析C++编程中基类与基类的继承的相关知识

    深入解析C++编程中基类与基类的继承的相关知识

    这篇文章主要介绍了C++编程中基类与基类的继承的相关知识,包括多个基类继承与虚拟基类等重要知识,需要的朋友可以参考下
    2016-01-01
  • 详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别

    这篇文章主要介绍了详解C语言中Char型指针数组与字符数组的区别的相关资料,希望通过本文能帮助到大家掌握理解这部分内容,需要的朋友可以参考下
    2017-10-10
  • C++中构造函数详解

    C++中构造函数详解

    大家好,本篇文章主要讲的是C++中构造函数详解,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-02-02

最新评论