给定一个二维的 0-1 矩阵,其中 0 表示海洋,1 表示陆地。单独的或相邻的陆地可以形成岛屿,每个格子只与其上下左右四个格子相邻。求最大的岛屿面积。

Input:
[[1,0,1,1,0,1,0,1],
[1,0,1,1,0,1,1,1],
[0,0,0,0,0,0,0,1]]
Output: 6

思路:
有时我们可能会需要对已经搜索过的节点进行标记,以防止在遍历时重复搜索某个节点,这种做法叫做状态记录或记忆化(memoization)。
一般来说,深度优先搜索类型的题可以分为主函数和辅函数,主函数用于遍历所有的搜索位置,判断是否可以开始搜索,如果可以即在辅函数进行搜索。辅函数则负责深度优先搜索的递归调用。当然,我们也可以使用栈(stack)实现深度优先搜索,但因为栈与递归的调用原理相同,而递归相对便于实现,因此刷题时笔者推荐使用递归式写法,同时也方便进行回溯(见下节)。不过在实际工程上,直接使用栈可能才是最好的选择,一是因为便于理解,二是更不易出现递归栈满的情况。我们先展示使用栈的写法:
(1)遍历所有元素
(2)遇到1的直接入栈计算,栈里面所有元素在四个方向有1的继续入栈
(3)标记好已经搜索过的地方

def maxAreaOfIsland(grid):direction = [-1, 0, 1, 0, -1]m = len(grid)  # 行n = len(grid[0]) if m else 0  # 列area = 0for i in range(0, m):for j in range(0, n): # (1)遍历所有元素if grid[i][j]:  # 首先得确认这是一块陆地,才能往下发展local_area = 1grid[i][j] = 0island = []island.append([i, j])while len(island): # 遇到1的直接入栈计算,栈里面所有元素在四个方向有1的继续入栈r, c = island.pop()  # 栈顶元素for k in range(0, 4):  # 栈顶元素的四个方向x = r + direction[k]y = c + direction[k + 1]if x >= 0 and x < m and y >= 0 and y < n and grid[x][y] == 1:  # 栈顶元素的这个方向遇到的是不是1grid[x][y] = 0local_area += 1island.append([x, y])area = max(area, local_area)return areagrid_t = [[1, 0, 1, 1, 0, 1, 0, 1],[1, 0, 1, 1, 0, 1, 1, 1],[0, 0, 0, 0, 0, 0, 0, 1]]print(maxAreaOfIsland(grid_t))

在辅函数里,一个一定要注意的点是辅函数内递归搜索时,边界条件的判定。边界判定一般
有两种写法,一种是先判定是否越界,只有在合法的情况下才进行下一步搜索(即判断放在调用
递归函数前);另一种是不管三七二十一先进行下一步搜索,待下一步搜索开始时再判断是否合
法(即判断放在辅函数第一行)。

此外的主函数+辅助函数的写法(C++):

vector<int> direction { -1, 0, 1, 0, -1 };
/* 主函数 */
int maxAreaOfIsland( vector<vector<int> > & grid )
{if ( grid.empty() || grid[0].empty() )return(0);int max_area = 0;for ( int i = 0; i < grid.size(); ++i ){for ( int j = 0; j < grid[0].size(); ++j ){if ( grid[i][j] == 1 ){max_area = max( max_area, dfs( grid, i, j ) );}}}return(max_area);
}/* 辅函数 */
int dfs( vector<vector<int> > & grid, int r, int c )
{if ( grid[r][c] == 0 )return(0);grid[r][c] = 0;int x, y, area = 1;for ( int i = 0; i < 4; ++i ){x = r + direction[i], y = c + direction[i + 1];if ( x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size() ){area += dfs( grid, x, y );}}return(area);
}
/* 主函数 */
int maxAreaOfIsland( vector<vector<int> > & grid )
{if ( grid.empty() || grid[0].empty() )return(0);int max_area = 0;for ( int i = 0; i < grid.size(); ++i ){for ( int j = 0; j < grid[0].size(); ++j ){max_area = max( max_area, dfs( grid, i, j ) );}}return(max_area);
}/* 辅函数 */
int dfs( vector<vector<int> > & grid, int r, int c )
{if ( r < 0 || r >= grid.size() ||c < 0 || c >= grid[0].size() || grid[r][c] == 0 ){return(0);}grid[r][c] = 0;return(1 + dfs( grid, r + 1, c ) + dfs( grid, r - 1, c ) +dfs( grid, r, c + 1 ) + dfs( grid, r, c - 1 ) );
}

参考:LeetCode 101:和你一起你轻松刷题(C++)

【算法题目】【DFS】岛屿的最大面积相关推荐

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

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

  2. 算法编程10:岛屿的最大面积

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

  3. 力扣(Leetcode)695. 岛屿的最大面积(Java)带注释

    leetcode刷题695. 岛屿的最大面积 1.题目描述 2.解法 1.DFS(深度优先搜索) 2.DFS + 栈 1.题目描述 给你一个大小为 m x n 的二进制矩阵 grid . 岛屿 是由一 ...

  4. 695. Max Area of Island (Medium)——岛屿的最大面积

    前言: 本题目为深度优先遍历(DFS) 算法的一道典型例题. 题目 : 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成 ...

  5. [695].岛屿的最大面积

    岛屿的最大面积 题目 函数原型 边界判断 算法设计:求最大的联通分量个数 算法设计:Flood Fill算法 算法设计:并查集 题目 给定一个包含了一些 0 和 1 的非空二维数组 grid. 一个 ...

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

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

  7. 岛屿问题 通用解-463.岛屿周长-200.岛屿数量-695.岛屿的最大面积-827.最大人工岛

    文章目录 岛屿问题 如何在网格上做DFS(通用解) 463.岛屿的周长 题目 题解 -通用模板 题解2 200.岛屿数量 题目 题解 695.岛屿的最大面积 题目 题解 827.最大人工岛 题目 题解 ...

  8. LeetCode 695. 岛屿的最大面积【c++/java详细题解】

    目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定一个包含了一些 0 和 1 的非空二维数组 grid . 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相 ...

  9. Leetcode(695)——岛屿的最大面积

    Leetcode(695)--岛屿的最大面积 题目 给你一个大小为 m × n m \times n m×n 的二进制矩阵 grid . 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相 ...

  10. LeetCode-算法-岛屿的最大面积

    力扣题目地址:https://leetcode-cn.com/problems/max-area-of-island/ 首先看题目: 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 ...

最新文章

  1. symantec backup exec 2010 基本错误总结
  2. 在java中图片随机播放_java-以相同顺序随机播放多个文件
  3. 推荐一个准确率99.9%的离线IP地址定位服务!
  4. 第十天学习@javascript
  5. 冰点文库下载器去广告版百度文库下载工具
  6. Go测试远控免杀学习
  7. 用计算机刻盘,电脑怎么刻盘_怎么将电脑桌面的文件刻录到cd光盘
  8. NVIDIA显卡驱动重装
  9. 对话阿里云,后疫情时代数字化的关键词
  10. AndroidQ SystemUI之插件化机制Plugin
  11. 用户权限---u+s\g+s\o+t三个特殊权限说明
  12. python量化交易策略实例_实践《Python与量化投资从基础到实战》PDF代码+《量化交易之路用Python做股票量化分析》PDF代码解释...
  13. DEC6713开发板的摸索(1)
  14. html2day(合并单元格,有序、无序列表,input、select、textarea表单)
  15. hive 建表-复杂数据类型
  16. 欢聚时代(YY)视频编解码面经
  17. c语言编写程序出错怎么改,这个C语言程序怎么改才对?
  18. Android“应用未安装”的解决办法
  19. 12月第3周网络安全报告:发现放马站点域名131个
  20. 游戏开发之路之“复刻或升级游戏”---地球末日生存

热门文章

  1. 如何使用Eclipse aCute来进行C#和.NET Core开发
  2. ORB-SLAM2——Trackin线程
  3. WORD BYTE 相互转换
  4. 拼音工具(pinyin4j)
  5. CDGA|企业数字化转型进展得越快就越好吗?
  6. 2023 即将来临,可能移动开发的大环境比 2022 还要差。
  7. 【Python爬虫】爬取公共交通站点数据
  8. ActiveMQ的消息格式MapMessage
  9. 集合 Transformer(Set Transformer)
  10. 【Oracle的卸载和安装】油桶数据库教学