岛屿的最大面积--DFS(附搜索全家桶)
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(附搜索全家桶)相关推荐
- LC 695 岛屿的最大面积 DFS
给你一个大小为 m x n 的二进制矩阵 grid . 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻.你可以假设 grid 的 ...
- python就业前景不好_Python就业前景好不好?学Python好找工作吗?【附资料全家桶—网络爬虫入门到实践】...
Python是目前市场上大家听说最多的编程语言吧,0基础小白学什么?当然Python,转行学什么?也是Python--那么Python的发展前景真的好吗?学完好找工作吗带领大家了解一下吧. 1.就业岗 ...
- LeetCode695. 岛屿的最大面积———海岛
题目描述 给定一个n*n的二维地图,地图由0,1组成.0代表海洋,1代表陆地.相邻(上下左右)的陆地可以看作一个整体称之为大陆板块,大陆板块的面积是组成陆地的数量.现在有机会填补一个单位的海洋,要求使 ...
- 一张思维导图读懂Adobe全家桶软件大全及功能应用
一图读懂Adobe全家桶功能及应用 另附Adobe全家桶软件图标大全:https://download.csdn.net/download/VeryDelicious/21718800
- LeetCode 695. 岛屿的最大面积(图的BFS/DFS)
文章目录 1. 题目 2. 解题 2.1 BFS广度优先搜索 2.2 DFS深度优先搜索 1. 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直 ...
- DFS深度优先搜索 岛屿问题 涂色问题 扫雷游戏
题目:https://leetcode-cn.com/problems/number-of-islands/ 参考:https://leetcode-cn.com/problems/number-of ...
- 岛屿类-网格类问题-DFS | 力扣695. 岛屿的最大面积
思路参考上文: 岛屿类-网格类问题-DFS | 力扣200. 岛屿数量 本文讲解695. 岛屿的最大面积问题,属于常见的岛屿类-网格类问题 本题使用DFS的思想 题目 给定一个包含了一些 0 和 1 ...
- 水域大小/岛屿最大面积-dfs
695.岛屿的最大面积 面试题 16.19. 水域大小 基本的dfs模板如下: for (int i = 0; i < grid.length; i++) {for (int i1 = 0; i ...
- Leecode DFS深度优先搜索
定义 图解 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一 ...
最新文章
- Intellij IDEA 没办法创建java文件
- oauth2 增加token 返回参数_一张图搞定OAuth2.0
- 关于子网划分—为什么全0全1子网号不能使用
- eclipse怎么创建web项目html,eclipse入门之创建第一个web程序(jsp测试环境)
- ffmpeg H264 编解码配置
- 【收藏】从 0 到 1 学习 elasticsearch ,这一篇就够了!
- Linux MTD系统剖析
- 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包
- qt 添加依赖库lib_在QT中添加LIB的方法
- 单因素方差分析graphpad_【SPSS】单因素方差分析(比较均值gt;单因素ANOVA)
- python os模块 os.chmod
- 思科交换机配置试题_思科交换机配置命令
- Arduino射频识别RC522至数据库
- html网页设计大赛作品介绍,html简单网页设计作品
- 阿里巴巴中国站搜索店铺列表 API 返回值说明
- iphone7p配置参数详情_iPhone12系列最全的详细参数,参数党可以看看
- 为什么Lisp如此先进,却永远成为不了编程主流语言?深度解析Lisp的优势与劣势
- TP5 入口文件提到根目录
- Vue.use 写多个_尼玛扎西:躬耕高原 把论文写在大地上
- 上市公司内审工作内容有哪些
热门文章
- checkbox(复选框)和radio(单选按钮)的区别与详解
- jQuery EasyUI parser
- Java类库Google Guava学习
- 20杭电计算机专业考研科目,杭州电子科技大学计算机科学与技术(一级学科)研究生考试科目和考研参考书目...
- 表单设计器的调研总结
- automl -综述
- Radio Frequency Identification 射频识别
- 金声玉振-数据库技术和生态变革创新的十年
- Docker: Create Image from Container
- 如何把模型内的参数与intralink8.0里的属性映射起来