最大的岛屿

  • 简介

    • 比较常见的棋盘类型的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最大岛屿问题相关推荐

  1. 深度优先遍历算法-01小偷偷东西问题

    小偷偷东西问题 前言 深度优先遍历是经典的图论算法,深度优先遍历算法的搜索逻辑和它的名字一样,只要有可能,就尽量深入搜索,直到找到答案,或者尝试了所有可能后确定没有解. 简单来说,深度优先遍历就是按照 ...

  2. 带父节点的平衡二叉树_Python算法系列—深度优先遍历算法【二叉树】

    一.什么是深度优先遍历 深度优先遍历算法是经典的图论算法.从某个节点v出发开始进行搜索.不断搜索直到该节点所有的边都被遍历完,当节点v所有的边都被遍历完以后,深度优先遍历算法则需要回溯到v以前驱节点来 ...

  3. 图的遍历(搜索)算法 之 深度优先遍历算法

    图的遍历的定义: 从图中的某个顶点出发访问遍图中的所有顶点,并且每个顶点仅仅被访问一次. 图的遍历算法我们常见的而且用的最多的就有两种:其一是图的深度优先遍历算法:其二是图的广度优先遍历算法.这里我们 ...

  4. Python算法系列—深度优先遍历算法【二叉树】

    深度优先遍历算法之二叉树 一.什么是深度优先遍历 二.二叉树 1. 二叉树简介 2.二叉树类型 3.二叉树相关术语 4. 二叉树的节点代码 5. 二叉树遍历顺序 6.深度优先遍历和广度优先遍历 三.面 ...

  5. rapidio 网络枚举--深度优先遍历算法

    根据 RapidIO 协议规范在 RapidIO 路由网络拓扑结构中,一般采用深度优先遍历 的枚举算法,因为广度优先遍历算法空间复杂度大,在规模较大的 RapidIO 网络中容易找 不到最优路径. R ...

  6. 深度优先遍历算法-03二叉树路径遍历问题

    二叉树路径遍历 简述 比较基础的一个DFS的题目,但是确实很多难题的模板.LeetCode很多二叉树的题本质上就是这个路径遍历. 本题为了输出路径,使用DFS的经典结构栈完成. 问题描述 给定一个二叉 ...

  7. 417. 太平洋大西洋水流问题(medium) -力扣(leetCode)逆流而上,JS图的深度优先遍历算法

    ⚡️417. 太平洋大西洋水流问题⚡️ 给定一个 m x n 的非负整数矩阵来表示一片大陆上各个单元格的高度."太平洋"处于大陆的左边界和上边界,而"大西洋"处 ...

  8. 关于深度优先遍历算法-c++语言

    深度优先遍历及例题加讲解 竞赛里面重要算法,全当学习笔记啦.(如有不足多多谅解) 零.什么是深度优先遍历 深度优先遍历简称DFS(Depth First Search). 我们简单的举个栗子: 从前有 ...

  9. 广度优先遍历算法-02合法的括号问题

    合法的括号 简介 比较基础的BFS题目. 注意,由于要对不合法的字符串最小步数删减为合法的字符串,所以BFS合适. 之所以选择BFS,是因为要返回的结果为删减最小数目的括号后使字符串合法," ...

最新文章

  1. 三公子论「财务自由」
  2. ue4加载本地版本_【虚幻4】创建本地数据库
  3. 在终端执行 Python 代码的 6 种方法,原来还能这样!
  4. Project: Individual Project - Word frequency program----11061192zmx
  5. php文件上传错误代码
  6. matlab群延时函数,群延迟函数(group delay function)群延迟滤波器 | 学步园
  7. C#多线程编程系列(四)- 使用线程池
  8. mysql不支持emoji表情的问题的解决方法
  9. 道路设计基础知识,让你一秒变大师
  10. java utf8 gbk 乱码,java UTF-8转GBK不乱码
  11. Windows的CMD的NET命令net start , net stop ...
  12. 判断是否打开相机权限,如果没有打开相机权限
  13. EXCEL表格F4绝对引用突然失效,无反应
  14. Linux三剑客(grep、sed、awk)
  15. dz中footer.php在哪找,dz模版制作教程
  16. Goolgle Analytics
  17. 东北旅行第一天流水账
  18. 用递归+缓存求阶乘和排列组合数
  19. 如何在shell脚本中定义数组及遍历
  20. Exception encountered during context initialization(报错详解)

热门文章

  1. 时域和频域的简单理解方法
  2. 三星i8268android4.4,三星I8268(移动版)
  3. Struts2 拦截器中实现对数据进行数据库操作
  4. 李开复给大学生的第四封信---大学四年应是这样度过
  5. Linux串口权限与udev理解
  6. Java 轻量级框架Spring曝出0day漏洞
  7. 寒冬来临,它却屡屡拿奖,成为国家认可的区块链项目
  8. 香橙派Orange Pi i96 初次使用遇到的坑和解决方法+附加c# iot .net 代码实例
  9. 黑进腾讯内部系统,攻破论坛服务器,揭晓16岁天才黑客背后的真相
  10. QT常用实用的界面设计技巧