0x01.问题

给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。

找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)

输入示例:

[[0,0,1,0,0,0,0,1,0,0,0,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,1,1,0,1,0,0,0,0,0,0,0,0],
 [0,1,0,0,1,1,0,0,1,0,1,0,0],
 [0,1,0,0,1,1,0,0,1,1,1,0,0],
 [0,0,0,0,0,0,0,0,0,0,1,0,0],
 [0,0,0,0,0,0,0,1,1,1,0,0,0],
 [0,0,0,0,0,0,0,1,1,0,0,0,0]]

输出示例:

6

解释:最大的岛屿面积为6

C++函数形式为:   int maxAreaOfIsland(vector<vector<int>>& grid) 

0x02.分析问题

要想得到一个小岛屿的面积,我们第一感觉肯定就是搜索,怎么搜索呢,遍历每一个结点,如果是1,就开始搜索,直到把这个结点所在的岛屿全部遍历到,然后可以得到这个岛屿的面积,具体的搜索过程,可以使用DFS,没有路了就回来,不断的回溯。

为了知道我们哪些地方是已经遍历到了的,我们的第一想法肯定就是设置一个标志数组,访问记为1,这种想法确实可以,但没有必要。

为什么呢?因为我们之前已经遍历到了的话,已经参与计数了,那么这个点就失去了它存在的意义,我们就可以假设它不存在,如何假设,有点是1,没有是0,把1变成0就可以了,这样还可以省下一个二维数组的空间,这种方法也叫 沉岛思想。

0x03.解决代码--DFS(递归)

class Solution {
public:int DFS(int x,int y,vector<vector<int>>& grid){if(x<0||y<0||x>=grid.size()||y>=grid[0].size()||grid[x][y]==0){return 0;}int num=1;grid[x][y]=0;num+=DFS(x+1,y,grid);num+=DFS(x,y+1,grid);num+=DFS(x-1,y,grid);num+=DFS(x,y-1,grid);return num;}int maxAreaOfIsland(vector<vector<int>>& grid) {int maxSize=0;for(int i=0;i<grid.size();i++){for(int j=0;j<grid[0].size();j++){if(grid[i][j]==1){maxSize=max(maxSize,DFS(i,j,grid));}}}return maxSize;}
};

0x04.解决代码--DFS(栈)

思路就是访问结点访问时,我们将对围绕它四个方向进行探索,找到还未访问的结点,加入到栈中。

只要栈不为空,就从栈中取出一个元素并访问。

这样就可以达到递归同样的效果。

class Solution {
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int maxSize = 0;for (int i = 0; i != grid.size(); ++i){for (int j = 0; j != grid[0].size(); ++j) {if (grid[i][j] == 1) {int cur = 0;stack<int> stacki;stack<int> stackj;stacki.push(i);stackj.push(j);while (!stacki.empty()) {int x = stacki.top(), y = stackj.top();stacki.pop();stackj.pop();if (x < 0 || y < 0 || x == grid.size() || y == grid[0].size() || grid[x][y] != 1)continue;++cur;grid[x][y] = 0;int dx[4] = { 0, 0, 1, -1 };int dy[4] = { 1, -1, 0, 0 };for (int index = 0; index != 4; ++index) {int next_x = x + dx[index], next_y = y + dy[index];stacki.push(next_x);stackj.push(next_y);}}maxSize = max(maxSize, cur);}}return maxSize;}
};

0x05.解决代码--BFS(广度,队列)

思路是每次从队首取出结点,并将接下来想要遍历的土地放在队尾,就实现了广度的搜索。

class Solution {
public:int maxAreaOfIsland(vector<vector<int>>& grid) {int maxSize = 0;for (int i = 0; i != grid.size(); ++i)for (int j = 0; j != grid[0].size(); ++j) {if (grid[i][j] == 1) {int cur = 0;queue<int> queuei;queue<int> queuej;queuei.push(i);queuej.push(j);while (!queuei.empty()) {int x = queuei.front(), y = queuej.front();queuei.pop();queuej.pop();if (x < 0 || y < 0 || x == grid.size() || y == grid[0].size() || grid[x][y] != 1)continue;++cur;grid[x][y] = 0;int dx[4] = { 0, 0, 1, -1 };int dy[4] = { 1, -1, 0, 0 };for (int index = 0; index != 4; ++index) {int next_x = x + dx[index], next_y = y + dy[index];queuei.push(next_x);queuej.push(next_y);}}maxSize = max(maxSize, cur);}}return maxSize;}
};

ATFWUS  --Writing  By 2020--03--15

岛屿的最大面积--DFS(附搜索全家桶)相关推荐

  1. LC 695 岛屿的最大面积 DFS

    给你一个大小为 m x n 的二进制矩阵 grid . 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻.你可以假设 grid 的 ...

  2. python就业前景不好_Python就业前景好不好?学Python好找工作吗?【附资料全家桶—网络爬虫入门到实践】...

    Python是目前市场上大家听说最多的编程语言吧,0基础小白学什么?当然Python,转行学什么?也是Python--那么Python的发展前景真的好吗?学完好找工作吗带领大家了解一下吧. 1.就业岗 ...

  3. LeetCode695. 岛屿的最大面积———海岛

    题目描述 给定一个n*n的二维地图,地图由0,1组成.0代表海洋,1代表陆地.相邻(上下左右)的陆地可以看作一个整体称之为大陆板块,大陆板块的面积是组成陆地的数量.现在有机会填补一个单位的海洋,要求使 ...

  4. 一张思维导图读懂Adobe全家桶软件大全及功能应用

    一图读懂Adobe全家桶功能及应用 另附Adobe全家桶软件图标大全:https://download.csdn.net/download/VeryDelicious/21718800

  5. LeetCode 695. 岛屿的最大面积(图的BFS/DFS)

    文章目录 1. 题目 2. 解题 2.1 BFS广度优先搜索 2.2 DFS深度优先搜索 1. 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直 ...

  6. DFS深度优先搜索 岛屿问题 涂色问题 扫雷游戏

    题目:https://leetcode-cn.com/problems/number-of-islands/ 参考:https://leetcode-cn.com/problems/number-of ...

  7. 岛屿类-网格类问题-DFS | 力扣695. 岛屿的最大面积

    思路参考上文: 岛屿类-网格类问题-DFS | 力扣200. 岛屿数量 本文讲解695. 岛屿的最大面积问题,属于常见的岛屿类-网格类问题 本题使用DFS的思想 题目 给定一个包含了一些 0 和 1 ...

  8. 水域大小/岛屿最大面积-dfs

    695.岛屿的最大面积 面试题 16.19. 水域大小 基本的dfs模板如下: for (int i = 0; i < grid.length; i++) {for (int i1 = 0; i ...

  9. Leecode DFS深度优先搜索

    定义 图解 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一 ...

最新文章

  1. Intellij IDEA 没办法创建java文件
  2. oauth2 增加token 返回参数_一张图搞定OAuth2.0
  3. 关于子网划分—为什么全0全1子网号不能使用
  4. eclipse怎么创建web项目html,eclipse入门之创建第一个web程序(jsp测试环境)
  5. ffmpeg H264 编解码配置
  6. 【收藏】从 0 到 1 学习 elasticsearch ,这一篇就够了!
  7. Linux MTD系统剖析
  8. 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包
  9. qt 添加依赖库lib_在QT中添加LIB的方法
  10. 单因素方差分析graphpad_【SPSS】单因素方差分析(比较均值gt;单因素ANOVA)
  11. python os模块 os.chmod
  12. 思科交换机配置试题_思科交换机配置命令
  13. Arduino射频识别RC522至数据库
  14. html网页设计大赛作品介绍,html简单网页设计作品
  15. 阿里巴巴中国站搜索店铺列表 API 返回值说明
  16. iphone7p配置参数详情_iPhone12系列最全的详细参数,参数党可以看看
  17. 为什么Lisp如此先进,却永远成为不了编程主流语言?深度解析Lisp的优势与劣势
  18. TP5 入口文件提到根目录
  19. Vue.use 写多个_尼玛扎西:躬耕高原 把论文写在大地上
  20. 上市公司内审工作内容有哪些

热门文章

  1. checkbox(复选框)和radio(单选按钮)的区别与详解
  2. jQuery EasyUI parser
  3. Java类库Google Guava学习
  4. 20杭电计算机专业考研科目,杭州电子科技大学计算机科学与技术(一级学科)研究生考试科目和考研参考书目...
  5. 表单设计器的调研总结
  6. automl -综述
  7. Radio Frequency Identification 射频识别
  8. 金声玉振-数据库技术和生态变革创新的十年
  9. Docker: Create Image from Container
  10. 如何把模型内的参数与intralink8.0里的属性映射起来