iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode之岛屿数量的示例分析
  • 264
分享到

C++实现LeetCode之岛屿数量的示例分析

2023-06-20 17:06:04 264人浏览 薄情痞子
摘要

这篇文章主要为大家展示了“c++实现LeetCode之岛屿数量的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++实现LeetCode之岛屿数量的示例分析”这篇文章吧。[LeetCod

这篇文章主要为大家展示了“c++实现LeetCode之岛屿数量的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++实现LeetCode之岛屿数量的示例分析”这篇文章吧。

[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;    }};

以上是“C++实现LeetCode之岛屿数量的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C++实现LeetCode之岛屿数量的示例分析

本文链接: https://www.lsjlt.com/news/298860.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++实现LeetCode之岛屿数量的示例分析
    这篇文章主要为大家展示了“C++实现LeetCode之岛屿数量的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++实现LeetCode之岛屿数量的示例分析”这篇文章吧。[LeetCod...
    99+
    2023-06-20
  • C++实现LeetCode(200.岛屿的数量)
    [LeetCode] 200. Number of Islands 岛屿的数量 Given a 2d grid map of '1's (land) and '0...
    99+
    2024-04-02
  • Android开发岛屿数量算法示例解析
    目录前言岛屿数量前言 最近没有什么比较好的思路,之前有写过关于数据结构相关的内容。所以想往算法这方面看不看能不能捣鼓点出一些开发思路。 岛屿数量 之前接触过一个算法,比较有意思,可...
    99+
    2023-03-01
    Android开发岛屿数量算法 Android 算法
  • C++实现LeetCode之区间的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之区间的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 228.Summary Ranges 总结区间Given a so...
    99+
    2023-06-20
  • C++实现LeetCode的示例分析
    这篇文章主要介绍C++实现LeetCode的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Reverse a linked list from position m to n. ...
    99+
    2023-06-20
  • C++实现LeetCode之缺失区间的示例分析
    这篇文章给大家分享的是有关C++实现LeetCode之缺失区间的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] 163. Missing Ranges 缺失区间Given a sort...
    99+
    2023-06-20
  • C++实现LeetCode之神奇字典的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之神奇字典的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 676.Implement Magic Dictionary ...
    99+
    2023-06-20
  • C++实现LeetCode之包围区域的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之包围区域的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 130. Surrounded Regions 包围区域Giv...
    99+
    2023-06-20
  • C++实现LeetCode之版本比较的示例分析
    小编给大家分享一下C++实现LeetCode之版本比较的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧![LeetCode] 165.Compare Ver...
    99+
    2023-06-20
  • C++实现LeetCode之替换单词的示例分析
    这篇文章主要介绍C++实现LeetCode之替换单词的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 648.Replace Words 替换单词In English, we have a...
    99+
    2023-06-20
  • C++实现LeetCode之最短子数组求和的示例分析
    这篇文章主要介绍C++实现LeetCode之最短子数组求和的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和Gi...
    99+
    2023-06-20
  • C++实现LeetCode之求最大间距的示例分析
    这篇文章主要介绍C++实现LeetCode之求最大间距的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 164. Maximum Gap 求最大间距Given an unsorted ar...
    99+
    2023-06-20
  • C++实现LeetCode之加油站问题的示例分析
    这篇文章主要介绍C++实现LeetCode之加油站问题的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 134.Gas Station 加油站问题There are N ...
    99+
    2023-06-20
  • C++中LeetCode实现单独数字的示例分析
    这篇文章主要介绍了C++中LeetCode实现单独数字的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。[LeetCode] 136.Single Number 单独的...
    99+
    2023-06-20
  • C++实现LeetCode之前K个高频词的示例分析
    这篇文章主要介绍了C++实现LeetCode之前K个高频词的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。[LeetCode] 692.Top K Frequent ...
    99+
    2023-06-20
  • C++实现LeetCode之前K个高频元素的示例分析
    这篇文章主要为大家展示了“C++实现LeetCode之前K个高频元素的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++实现LeetCode之前K个高频元素的示例分析”这篇文章吧。[L...
    99+
    2023-06-20
  • C++实现LeetCode之添加和查找单词的示例分析
    这篇文章将为大家详细讲解有关C++实现LeetCode之添加和查找单词的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。[LeetCode] 211.Add and Search Word - Da...
    99+
    2023-06-20
  • C++使用LeetCode实现二叉搜索树的示例分析
    这篇文章将为大家详细讲解有关C++使用LeetCode实现二叉搜索树的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Given an integer n, generate all st...
    99+
    2023-06-20
  • leetcode链表之分割链表的示例分析
    这篇文章主要介绍了leetcode链表之分割链表的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目编写程序以 x 为基准分割链表,使得所有小于&...
    99+
    2023-06-19
  • LeetCode中两数相加的示例分析
    小编给大家分享一下LeetCode中两数相加的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!题目描述给定两个非空链表来代表两个非负整数。数字最高位位于链表...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作