深度优先遍历算法-02最大岛屿问题
最大的岛屿
- 简介
- 比较常见的棋盘类型的DFS问题。
- 问题描述
- 给定一个二维矩阵,其中0代表海洋,1代表陆地(相邻的1连接形成岛屿),现在要求找到最大岛屿面积。
- 是不是有一种LeetCode的既视感。
- 问题分析
- 简单暴力的核心思路就是计算每个岛屿的面积,找到最大的即可。
- 使用从左到右,从上到下的思路遍历矩阵,找到1就说明发现了岛屿,就以岛屿为出发点开始计算面积(根据这个面积决定是否更新最大面积)。
- 现在的问题就只有,遇到1按照什么规律查看这一整个岛屿呢?显然,由于矩阵的特性以及岛屿的组成规则,可以按照上下左右四个方向进行查找。
- 深度优先遍历就是这样开始的:从登陆岛屿的第一个位置开始,按照四个方向的规则不断计算岛屿的面积。计算完脚下的,就要走到一个能走的下一个位置,对于下一个位置的选择按照上下左右的顺序进行,知道走到不能走为止。为了不重复计算,增大开销,走过的土地修改为2,标记走过。
- 代码
# -*-coding:utf-8-*-class Solution(object):def dfs(self, i, j, current_area, grid, max_value=None):# 开始遍历,标记访问grid[i][j] = 2# 向上走可行if i > 0 and grid[i - 1][j] == 1:current_area = self.dfs(i - 1, j, current_area + 1, grid, )if i < len(grid) - 1 and grid[i + 1][j] == 1:current_area = self.dfs(i + 1, j, current_area + 1, grid, )if j > 0 and grid[i][j - 1] == 1:current_area = self.dfs(i, j - 1, current_area + 1, grid, )if j < len(grid) - 1 and grid[i][j + 1] == 1:current_area = self.dfs(i, j + 1, current_area + 1, grid, )self.max_area = max(current_area, self.max_area)return current_areadef get_max_area(self, grid):self.max_area = 0row = len(grid)column = len(grid[0])for i in range(row):for j in range(column):if grid[i][j] == 1:# 发现陆地current_area = 1self.dfs(i, j, current_area, grid, self.max_area)return self.max_areaif __name__ == '__main__':grid = [[0, 0, 0, 0, 1, 1, 0],[0, 1, 1, 0, 1, 1, 0],[0, 1, 1, 0, 0, 0, 0],[0, 0, 1, 0, 0, 1, 1],[0, 0, 0, 0, 0, 0, 0],[0, 0, 1, 1, 0, 0, 0],[0, 0, 0, 1, 0, 0, 1]]print(Solution().get_max_area(grid))```
- 运行结果
- 补充说明
- 具体代码可以查看我的Github,欢迎Star或者Fork
- 参考书《你也能看得懂的Python算法书》
深度优先遍历算法-02最大岛屿问题相关推荐
- 深度优先遍历算法-01小偷偷东西问题
小偷偷东西问题 前言 深度优先遍历是经典的图论算法,深度优先遍历算法的搜索逻辑和它的名字一样,只要有可能,就尽量深入搜索,直到找到答案,或者尝试了所有可能后确定没有解. 简单来说,深度优先遍历就是按照 ...
- 带父节点的平衡二叉树_Python算法系列—深度优先遍历算法【二叉树】
一.什么是深度优先遍历 深度优先遍历算法是经典的图论算法.从某个节点v出发开始进行搜索.不断搜索直到该节点所有的边都被遍历完,当节点v所有的边都被遍历完以后,深度优先遍历算法则需要回溯到v以前驱节点来 ...
- 图的遍历(搜索)算法 之 深度优先遍历算法
图的遍历的定义: 从图中的某个顶点出发访问遍图中的所有顶点,并且每个顶点仅仅被访问一次. 图的遍历算法我们常见的而且用的最多的就有两种:其一是图的深度优先遍历算法:其二是图的广度优先遍历算法.这里我们 ...
- Python算法系列—深度优先遍历算法【二叉树】
深度优先遍历算法之二叉树 一.什么是深度优先遍历 二.二叉树 1. 二叉树简介 2.二叉树类型 3.二叉树相关术语 4. 二叉树的节点代码 5. 二叉树遍历顺序 6.深度优先遍历和广度优先遍历 三.面 ...
- rapidio 网络枚举--深度优先遍历算法
根据 RapidIO 协议规范在 RapidIO 路由网络拓扑结构中,一般采用深度优先遍历 的枚举算法,因为广度优先遍历算法空间复杂度大,在规模较大的 RapidIO 网络中容易找 不到最优路径. R ...
- 深度优先遍历算法-03二叉树路径遍历问题
二叉树路径遍历 简述 比较基础的一个DFS的题目,但是确实很多难题的模板.LeetCode很多二叉树的题本质上就是这个路径遍历. 本题为了输出路径,使用DFS的经典结构栈完成. 问题描述 给定一个二叉 ...
- 417. 太平洋大西洋水流问题(medium) -力扣(leetCode)逆流而上,JS图的深度优先遍历算法
⚡️417. 太平洋大西洋水流问题⚡️ 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处 ...
- 关于深度优先遍历算法-c++语言
深度优先遍历及例题加讲解 竞赛里面重要算法,全当学习笔记啦.(如有不足多多谅解) 零.什么是深度优先遍历 深度优先遍历简称DFS(Depth First Search). 我们简单的举个栗子: 从前有 ...
- 广度优先遍历算法-02合法的括号问题
合法的括号 简介 比较基础的BFS题目. 注意,由于要对不合法的字符串最小步数删减为合法的字符串,所以BFS合适. 之所以选择BFS,是因为要返回的结果为删减最小数目的括号后使字符串合法," ...
最新文章
- 三公子论「财务自由」
- ue4加载本地版本_【虚幻4】创建本地数据库
- 在终端执行 Python 代码的 6 种方法,原来还能这样!
- Project: Individual Project - Word frequency program----11061192zmx
- php文件上传错误代码
- matlab群延时函数,群延迟函数(group delay function)群延迟滤波器 | 学步园
- C#多线程编程系列(四)- 使用线程池
- mysql不支持emoji表情的问题的解决方法
- 道路设计基础知识,让你一秒变大师
- java utf8 gbk 乱码,java UTF-8转GBK不乱码
- Windows的CMD的NET命令net start , net stop ...
- 判断是否打开相机权限,如果没有打开相机权限
- EXCEL表格F4绝对引用突然失效,无反应
- Linux三剑客(grep、sed、awk)
- dz中footer.php在哪找,dz模版制作教程
- Goolgle Analytics
- 东北旅行第一天流水账
- 用递归+缓存求阶乘和排列组合数
- 如何在shell脚本中定义数组及遍历
- Exception encountered during context initialization(报错详解)