C#LeetCode刷题之#695-岛屿的最大面积( Max Area of Island)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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)的更多相关文章
- [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 ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
- C#LeetCode刷题-深度优先搜索
深度优先搜索篇 # 题名 刷题 通过率 难度 98 验证二叉搜索树 22.2% 中等 99 恢复二叉搜索树 45.1% 困难 100 相同的树 48.1% 简单 101 对称二叉树 4 ...
- C#LeetCode刷题-哈希表
哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串 24.2% 中等 18 四数之和 ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
- leetcode刷题目录
leetcode刷题目录 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 4. 寻找两个有序数组的中位数 5. 最长回文子串 6. Z 字形变换 7. 整数反转 8. 字符串转换整数 (a ...
- LeetCode刷题专栏第一篇--思维导图&时间安排
昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...
- leetcode 刷题进展
最近没发什么博客了 凑个数 我的leetcode刷题进展 https://gitee.com/def/leetcode_practice 个人以为 刷题在透不在多 前200的吃透了 足以应付非算法岗 ...
- LeetCode刷题指南(字符串)
作者:CYC2018 文章链接:https://github.com/CyC2018/CS-Notes/blob/master/docs/notes/Leetcode+%E9%A2%98%E8%A7% ...
随机推荐
- Spring用到了那些注解?
一:@Autowired(按类型注入)1.1通过 @Autowired的使用来消除 set ,get方法.@Autowiredprivate Dao dao;这样就可以删除set ,get方法和spr ...
- 第一部分软件测试综述——软件测试背景【软件测试】(美)Ron Patton中文电子版
截取自:第一部分软件测试综述——软件测试背景[软件测试](美)Ron Patton中文电子版(有需要的可以关注我) 第一部分软件测试综述 对手的程序死掉叫崩溃.自己的程序死掉叫“身体不良反应(idio ...
- java 两个数组相减结果
public static void main(String[] args) { String[] a = new String[] { "1", "5", & ...
- 火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
一般点账户名——设置——安全设置中开通虚拟MFA两步验证 具体步骤见链接 火狐浏览器如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器? 二次验证码小程序于谷歌身份验证器APP的优势 1.无需下载 ...
- Docker 入门教程(2)——image与container
image镜像 Definition of: image Docker images are the basis of containers. An Image is an ordered colle ...
- Flutter.. 两个点语法含义
在Flutter编程中,会经常用到".."的语法糖,如下 state.clone() ..splashImg = action.img ..famousSentence = act ...
- Kafka入门(2):消费与位移
摘要 在这篇文章中,我将从消息在Kafka中的物理存储方式讲起,介绍分区-日志段-日志的各个层次. 然后我将接着上一篇文章的内容,把消费者的内容展开讲一讲,区分消费者与消费者组,以及这么设计有什么用. ...
- NGINX 上的限流
NGINX 上的限流(译) zlup YP小站 今天 前言 本文是对Rate Limiting with NGINX and NGINX Plus的主要内容(去掉了关于NGINX Plus相关内容) ...
- Salt 系统初始化
目录 编辑states文件 1.DNS配置 dns.sls(在init目录下创建一个files文件,然后把resolv.conf放到文件下) [root@master init]# cat dns. ...
- MacOS下Git安装及使用
微信搜索"艺术行者",关注并回复关键词"git"获取Github安装包 上传的在线学习视频(黑马和传智双元,感谢) 微信搜索"艺术行者",关 ...