问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3736 访问。

给定一个包含了一些 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。注意答案不应该是11,因为岛屿只能包含水平或垂直的四个方向的‘1’。

注:以上紫色部分为该题的解,粉红色部分是要注意的部分,答案是6而不是11。

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

对于上面这个给定的矩阵, 返回 0。

注意: 给定的矩阵grid 的长度和宽度都不超过 50。


Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) connected 4-directionally (horizontal or vertical.) You may assume all four edges of the grid are surrounded by water.

Find the maximum area of an island in the given 2D array. (If there is no island, the maximum area is 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]]

Given the above grid, return 6. Note the answer is not 11, because the island must be connected 4-directionally.

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

Given the above grid, return 0.
Note: The length of each dimension in the given grid does not exceed 50.


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3736 访问。

public enum SearchType {DepthFirstSearch,BreadthFirstSearch
}public class Program {public static void Main(string[] args) {int[,] nums = null;nums = new int[,]{{ 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}};var res = MaxAreaOfIsland(nums, SearchType.DepthFirstSearch);Console.WriteLine(res);nums = new int[,]{{ 0,0,0,0,0,0,0,0}};res = MaxAreaOfIsland(nums, SearchType.BreadthFirstSearch);Console.WriteLine(res);Console.ReadKey();}private static int MaxAreaOfIsland(int[,] grid, SearchType searchType) {//记录最大值var max = 0;//记录行和列数量var rows = grid.GetLength(0);var cols = grid.GetLength(1);//标记是否已经访问过了var visited = new bool[rows, cols];if(searchType == SearchType.DepthFirstSearch) {//使用深度优先搜索来遍历原数组for(var i = 0; i < rows; i++) {for(var j = 0; j < cols; j++) {if(visited[i, j]) continue;max = Math.Max(max, DepthFirstSearch(grid, i, j, visited));}}} else {max = Math.Max(max, BreadthFirstSearch(grid, visited));}//返回最大值return max;}private static int DepthFirstSearch(int[,] grid, int i, int j, bool[,] visited) {//深度优先搜索//记录行和列数量var rows = grid.GetLength(0);var cols = grid.GetLength(1);//处理边界if(i >= rows || j >= cols || i < 0 || j < 0) return 0;//若已经访问或不是岛屿则返回0if(visited[i, j] || grid[i, j] == 0) return 0;//标记当前节点已经访问过了visited[i, j] = true;//流程到了这里,当前节点为岛屿,所以返回上、下、左、右4个方向的结果+1return DepthFirstSearch(grid, i + 1, j, visited) +DepthFirstSearch(grid, i - 1, j, visited) +DepthFirstSearch(grid, i, j + 1, visited) +DepthFirstSearch(grid, i, j - 1, visited) + 1;}private static int BreadthFirstSearch(int[,] grid, bool[,] visited) {//广度优先搜索//记录最大值var max = 0;//记录行和列数量var rows = grid.GetLength(0);var cols = grid.GetLength(1);//开始搜索for(var i = 0; i < rows; i++) {for(var j = 0; j < cols; j++) {//若已经访问或不是岛屿则返回0if(visited[i, j] || grid[i, j] == 0) continue;//记录临时岛屿面积var area = 0;//栈在广度优先中的应用var stack = new Stack<KeyValuePair<int, int>>();//将当前节点压入栈中stack.Push(KeyValuePair.Create(i, j));//标记当前节点已经访问过了visited[i, j] = true;//栈空时,代表当前广度(横向)已搜索完毕while(stack.Count != 0) {//临时岛屿+1area++;//取出栈顶数据并记录var curNode = stack.Pop();//记录刚取出的栈顶元素的索引值var rowIndex = curNode.Key;var colIndex = curNode.Value;//从上、下、左、右4个方向var fix = new int[4, 2] {{-1,0 },{ 1,0},{ 0,-1},{ 0,1}};for(int k = 0; k < fix.GetLength(0); k++) {//处理边界if(rowIndex + fix[k, 0] >= 0 &&rowIndex + fix[k, 0] < rows &&colIndex + fix[k, 1] >= 0 &&colIndex + fix[k, 1] < cols) {//若为1或没有访问过,则继续if(grid[rowIndex + fix[k, 0], colIndex + fix[k, 1]] == 1 &&visited[rowIndex + fix[k, 0], colIndex + fix[k, 1]] == false) {stack.Push(KeyValuePair.Create(rowIndex + fix[k, 0], colIndex + fix[k, 1]));visited[rowIndex + fix[k, 0], colIndex + fix[k, 1]] = true;}}}}//比较当前最大值max = Math.Max(max, area);}}//返回最大值return max;}}

以上给出2种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3736 访问。

6
0

分析:

显而易见,深度优先搜索和广度优先搜索的时间复杂度均为:  。

C#LeetCode刷题之#695-岛屿的最大面积( Max Area of Island)相关推荐

  1. 每日一道leetcode(python)695. 岛屿的最大面积

    每日一道leetcode(python)695. 岛屿的最大面积 2021-08-21 给定一个包含了一些 0 和 1 的非空二维数组 grid .一个 岛屿 是由一些相邻的 1 (代表土地) 构成的 ...

  2. LeetCode刷题之883. 三维形体投影面积

    LeetCode刷题之883. 三维形体投影面积 我不知道将去向何方,但我已在路上! 时光匆匆,虽未曾谋面,却相遇于斯,实在是莫大的缘分,感谢您的到访 ! 题目: 在N*N的网格中,我们放置了一些与 ...

  3. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  4. Leetcode刷题 463题:岛屿的周长(基于Java语言)

    ** Leetcode刷题 463题:岛屿的周长(基于Java语言) ** 一. 题目描述: 给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域. 网格中的格子水平和垂直方向相 ...

  5. LeetCode刷题笔记汇总

    LeetCode刷题笔记汇总 第一次刷LeetCode写的一些笔记. 1.两数之和 3.无重复字符的最长子串 15.三数之和 18.四数之和 19.删除链表的倒数第 N 个结点 20.有效的括号 21 ...

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

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

  7. Leetcode刷题

    刷题 leetcode 1.两数之和 #哈希表 class Solution:def twoSum(self, nums: List[int], target: int) -> List[int ...

  8. 个人LeetCode刷题记录(带题目链接及解答)持续更新

    Leetcode 刷题 注:~[完成]代表还有一些方法没看,最后再看 一.一些需要重刷的典型题: 1.快速排序,归并排序,堆排序(递归的思想) 2.链表中的回文链表,其中的快慢指针,多看,多练 3.链 ...

  9. C#LeetCode刷题-深度优先搜索

    深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树 22.2% 中等 99 恢复二叉搜索树 45.1% 困难 100 相同的树 48.1% 简单 101 对称二叉树 42.1% 简单 ...

最新文章

  1. MXNet动手学深度学习笔记:卷积计算
  2. 成长必须避开的5个陷阱
  3. APAR:MON_OBJ_METRICS=EXTENDED导致IUD性能问题(转载自Db2技术分享)
  4. C语言工程代码查看神器 SourceInsight
  5. PHP - 解决中文乱码问题
  6. redis重启命令_这可能是你见过最全面的Redis主从复制原理
  7. 第18章 Linux集群架构
  8. 深度装机大师一键重装_笔记本怎么重装系统?笔记本自己如何重装系统?
  9. js-jquery-插件开发(一)
  10. 从一开始,说出事java匿名内部类
  11. python执行sql语句慢很多_Python学习教程:面试问:一条SQL语句执行得很慢的原因有哪些?...
  12. 鼠标键盘控制多台计算机,一个软件即可一套键盘鼠标控制多台电脑
  13. 8. Celery 4.3.0 Periodic Tasks 周期性任务调度
  14. 吴恩达机器学习第一周测试
  15. [转载]C++URL编码转换
  16. 【Excel】Excel无序数据模糊查询
  17. 凸优化工具包CVX快速入门
  18. java抢购_java redis 实现抢购秒杀
  19. 没有换行又很多很多行的代码,如何快捷换行?
  20. element 合并单元格

热门文章

  1. 【今日CV 计算机视觉论文速览】 11 Mar 2019
  2. CSDN的一些年度大牛(2018)
  3. 【C++面向对象】类的数据成员:绑定、布局和存取
  4. 谷歌浏览器安装过程-0223
  5. python-带参数的装饰器
  6. 数据结构与算法-字典的时间复杂度
  7. 如何配置yum源,并安装FTP服务器
  8. react全家桶实现招聘app-项目准备(一)
  9. IP釋放、清除、以及刷新DNS
  10. mysql show