问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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;
//若已经访问或不是岛屿则返回0
if(visited[i, j] || grid[i, j] == 0) return 0;
//标记当前节点已经访问过了
visited[i, j] = true;
//流程到了这里,当前节点为岛屿,所以返回上、下、左、右4个方向的结果+1
return 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++) {
//若已经访问或不是岛屿则返回0
if(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) {
//临时岛屿+1
area++;
//取出栈顶数据并记录
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. [Swift]LeetCode695. 岛屿的最大面积 | Max Area of Island

    Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land) conn ...

  2. C#LeetCode刷题-数组

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

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

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

  4. C#LeetCode刷题-哈希表

    哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串   24.2% 中等 18 四数之和   ...

  5. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

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

  6. leetcode刷题目录

    leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...

  7. LeetCode刷题专栏第一篇--思维导图&时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  8. leetcode 刷题进展

    最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多  前200的吃透了 足以应付非算法岗 ...

  9. LeetCode刷题指南(字符串)

    作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...

随机推荐

  1. Makefile中自动生成头文件依赖

    为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...

  2. C++语法小记---面向对象模型(实例的内存分布)

    面向对象的模型(内存分布) 对于一个对象而言,成员变量和成员函数是分开存放的 成员函数位于代码段,所有的类对象共有 成员变量为每一个对象独有,位于内存中 类对象在内存中的分布和struct完全相同 对 ...

  3. 小白在使用ISE编写verilog代码综合时犯得错误及我自己的解决办法

    一:错误原因,顶层信号声明类别错误 错误前 更改后 二:综合时警告 更改前: 错误原因:调用子模块时 输出端口只能用wire类型变量进行映射 这是verilog语法规定的 tx_done在uart_t ...

  4. java 手机号码归属地查询

    下面是利用第三方接口实现手机号码归属地查询 (复制请标明出处或留言) package com.test.yyc; import java.io.BufferedReader; import java. ...

  5. 常用限流算法与Guava RateLimiter源码解析

    在分布式系统中,应对高并发访问时,缓存.限流.降级是保护系统正常运行的常用方法.当请求量突发暴涨时,如果不加以限制访问,则可能导致整个系统崩溃,服务不可用.同时有一些业务场景,比如短信验证码,或者其它 ...

  6. 关于C# winform唤起本地已安装应用程序(测试win10,win7可用)

    想要唤起本地已安装应用程序,我想到的有三种可行的方法: 第一种就是打开本地的快捷方式(有的应用可能没有快捷方式,但这种方法效率最高,可配合其他方法使用),快捷方式分为本地桌面快捷方式和开始菜单中的快捷 ...

  7. .Net Core AES加解密

    项目中token在传输过程中采用了AES加密,  网上找到的两篇博文都有写问题,在这里记录一下.Net Core 2.2代码中AES加解密的使用: //AES加密 传入,要加密的串和, 解密key p ...

  8. Spring Boot+Socket实现与html页面的长连接,客户端给服务器端发消息,服务器给客户端轮询发送消息,附案例源码

    功能介绍 客户端给所有在线用户发送消息 客户端给指定在线用户发送消息 服务器给客户端发送消息(轮询方式) 项目搭建 项目结构图 pom.xml <?xml version="1.0&q ...

  9. kafka笔记——入门介绍

    中文文档 目录 kafka的优势 首先几个概念 kafka的四大核心API kafka的基本术语 主题和日志(Topic和Log) 每个分区都是一个顺序的,不可变的队列,并且可以持续的添加,分区中的每 ...

  10. linux下快速列出局域网中所有主机名(计算机名)的脚本

    最近有列出局域网中所有主机名的需求(SMB协议里的),但是findsmb命令总是列不全,搜了搜网上也没什么现成的解决方案,于是自己写了个python脚本 脚本会扫描局域网arp表中所有ip,并尝试解析 ...