面试算法105:最大的岛屿

题目

海洋岛屿地图可以用由0、1组成的二维数组表示,水平或竖直方向相连的一组1表示一个岛屿,请计算最大的岛屿的面积(即岛屿中1的数目)。例如,在下图中有4个岛屿,其中最大的岛屿的面积为5。
在这里插入图片描述

分析

将岛屿转换成图之后,岛屿的面积就变成子图中节点的数目。如果能计算出每个连通子图中节点的数目,就能知道最大的岛屿的面积。
在这里插入图片描述
可以逐一扫描矩阵中的每个格子,如果遇到一个值为1的格子并且它不在之前已知的岛屿上,那么就到达了一个新的岛屿,于是搜索这个岛屿并计算它的面积。在比较所有岛屿的面积之后就可以知道最大的岛屿的面积。
二维数组dirs表示在矩阵中向上、下、左、右这4个方向前进一步时坐标的变化。在矩阵中向上移动一步时行号减1而列号不变,所以坐标的改变值为(-1,0),其他方向的改变值类似。用当前坐标pos加上坐标的改变值就得到向不同方向前进一步之后的坐标。这样写代码的好处是容易用一个简洁的循环实现向4个不同方向前进。

解:广度优先搜索

public class Test {public static void main(String[] args) {int[][] grid = {{1, 1, 0, 0, 1},{1, 0, 0, 1, 0},{1, 1, 0, 1, 0},{0, 0, 1, 0, 0},};int result = maxAreaOfIsland(grid);System.out.println(result);}public static int maxAreaOfIsland(int[][] grid) {int rows = grid.length;int cols = grid[0].length;boolean[][] visited = new boolean[rows][cols];int maxArea = 0;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (grid[i][j] == 1 && !visited[i][j]) {int area = getArea(grid, visited, i, j);maxArea = Math.max(maxArea, area);}}}return maxArea;}// 广度优先搜索private static int getArea(int[][] grid, boolean[][] visited, int i, int j) {Queue<int[]> queue = new LinkedList<>();queue.add(new int[] {i, j});visited[i][j] = true;int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int area = 0;while (!queue.isEmpty()) {int[] pos = queue.remove();area++;for (int[] dir : dirs) {int r = pos[0] + dir[0];int c = pos[1] + dir[1];if (r >= 0 && r < grid.length && c >= 0 && c < grid[0].length && grid[r][c] == 1 && !visited[r][c]) {queue.add(new int[] {r, c});visited[r][c] = true;}}}return area;}}

解:基于栈实现深度优先搜索

public class Test {public static void main(String[] args) {int[][] grid = {{1, 1, 0, 0, 1},{1, 0, 0, 1, 0},{1, 1, 0, 1, 0},{0, 0, 1, 0, 0},};int result = maxAreaOfIsland(grid);System.out.println(result);}public static int maxAreaOfIsland(int[][] grid) {int rows = grid.length;int cols = grid[0].length;boolean[][] visited = new boolean[rows][cols];int maxArea = 0;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (grid[i][j] == 1 && !visited[i][j]) {int area = getArea(grid, visited, i, j);maxArea = Math.max(maxArea, area);}}}return maxArea;}// 基于栈实现深度优先搜索private static int getArea(int[][] grid, boolean[][] visited, int i, int j) {Stack<int[]> stack = new Stack<>();stack.push(new int[] {i, j});visited[i][j] = true;int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int area = 0;while (!stack.isEmpty()) {int[] pos = stack.pop();area++;for (int[] dir : dirs) {int r = pos[0] + dir[0];int c = pos[1] + dir[1];if (r >= 0 && r < grid.length && c >= 0 && c < grid[0].length && grid[r][c] == 1 && !visited[r][c]) {stack.push(new int[] {r, c});visited[r][c] = true;}}}return area;}}

解:基于递归实现深度优先搜索

public class Test {public static void main(String[] args) {int[][] grid = {{1, 1, 0, 0, 1},{1, 0, 0, 1, 0},{1, 1, 0, 1, 0},{0, 0, 1, 0, 0},};int result = maxAreaOfIsland(grid);System.out.println(result);}public static int maxAreaOfIsland(int[][] grid) {int rows = grid.length;int cols = grid[0].length;boolean[][] visited = new boolean[rows][cols];int maxArea = 0;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {if (grid[i][j] == 1 && !visited[i][j]) {int area = getArea(grid, visited, i, j);maxArea = Math.max(maxArea, area);}}}return maxArea;}// 基于递归实现深度优先搜索private static int getArea(int[][] grid, boolean[][] visited, int i, int j) {int area = 1;visited[i][j] = true;int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};for (int[] dir : dirs) {int r = i + dir[0];int c = j + dir[1];if (r >= 0 && r < grid.length && c >= 0 && c < grid[0].length && grid[r][c] == 1 && !visited[r][c]) {area += getArea(grid, visited, r, c);}}return area;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/337395.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海豹目标检测数据集VOC格式300张

海豹&#xff0c;一种可爱而迷人的海洋哺乳动物&#xff0c;以其独特的形态和特点而备受人们的喜爱。 海豹的体型流线型&#xff0c;非常适合在水中游动。它们的头部圆润&#xff0c;身体光滑&#xff0c;有着一对大大的眼睛和一对小耳朵。海豹的四肢演化成了鳍状肢&#xff0…

14:00面试,14:07就出来了,问的问题有点变态。。。

前言 刚从小厂出来&#xff0c;没想到在另一家公司我又寄了。 在这家公司上班&#xff0c;每天都要加班&#xff0c;但看在钱给的比较多的份上&#xff0c;也就不太计较了。但万万没想到一纸通知&#xff0c;所有人不准加班了&#xff0c;不仅加班费没有了&#xff0c;薪资还…

动态设置某个el-step的状态

保存后的步骤条显示绿色&#xff0c;未保存显示蓝色 饿了么官网文档中有写单个步骤设置状态的参数 前端页面中el-step中:status需要绑定变量 :status"stepStatus[0]" <el-steps class"steps_class" :active"active" align-center><el…

最新发布的Edge扩展插件:安装位置一览

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习产出&#xff1a; Edge扩展插件的介绍&#xff1a; Edge扩展插件的安装位置&#xff1a; Edge扩展插件的管理方式&#xff1a; Edge扩展插件的启用和禁用&#xff1a; 学习目标&#xff1a; 了解Edg…

Linux——firewalld防火墙(二)

一、firewalld高级配置 1、IP地址伪装 地址伪装&#xff08;masquerade):通过地址伪装&#xff0c;NAT设备将经过设备的包转发到指定接收方&#xff0c;同时将通过的数据包的源地址更改为其自己的接口地址。当返回的数据包到达时&#xff0c;会将目的地址修改为原始主机的地址…

Mjdjoureny详细教程

网站 https://gptgod.online/#/register?invite_code5kc4awzinkjcn6cmm1yk6qz9a 使用QQ邮箱登录以后,点击最下面的积分&#xff0c; 在填写连个验证码&#xff0c;就有5万积分 YHCU06D4HPD02CMTULSHYBCIEKG006 J6Z3V49E303ZLQA9ENKYX9N7XWMDML 训练 创建新会话&#xff0c…

STOP的用法

STOP运行时的效果和注意事项 STOP运行时会出现的异常代表什么 逻辑数据库---待续 NODES: sflight, sbook. DATA: bookings TYPE i, max TYPE i VALUE 100. GET sflight. cl_demo_output>next_section( |{ sflight-carrid } | && |{ sflight-connid } | && …

公司如何防止员工泄露办公终端电脑文件数据\资料——推荐核心部门部署【天锐绿盾终端安全管理系统】

为了防止员工泄露办公终端电脑的文件数据和资料&#xff0c;部署天锐绿盾终端安全管理系统是一个很好的选择。这个系统可以从多个方面保护企业的数据安全&#xff0c;特别是对于核心部门&#xff0c;其效果更为显著。 PC端访问地址&#xff1a; https://isite.baidu.com/site…

如何正确地理解应用架构并开发

许多同学或多或少都经历过这样的流程&#xff1a; 新同学刚来公司&#xff0c;学习了解团队的一些工程代码&#xff0c;并了解其中的代码风格团队新接手了一些其他团队的项目&#xff0c;需要了解工程结构以及概念如何定义工程项目的工程结构&#xff0c;包目录结构并达成团队共…

使用FFmpeg+EasyDarwin搭建音视频推拉流测试环境

1. 前言 在上一篇文章《使用VS2017在win10 x64上编译调试FFmpeg&#xff08;附源码和虚拟机下载&#xff09;》中&#xff0c;我们讲解了如何搭建FFmpeg源码编译和调试环境。 调试FFmpeg&#xff0c;还需要搭建流媒体服务器。流媒体服务器的作用是通过网络对外提供音视频服务…

高照数量关系(二)—— 工程问题 、几何问题、容斥原理、最值问题、年龄问题

工程问题 完工时间型 效率比例型 具体单位型 日期周期工程问题 牛吃草问题 几何问题 几何公式 三角形 最短路径 几何最值 同比例缩放 生活中的几何小游戏 容斥原理 两集合 三集合 画图法 容斥原理结合不定方程&#xff08;最值&#xff09; 最值问题 最不利构造 构造数列…

npm安装vue,添加淘宝镜像

如果是第一次使用命令栏可能会遇到权限问题。 解决vscode无法运行npm和node.js命令的问题-CSDN博客 安装 在vscode上面的导航栏选择terminal打开新的命令栏 另外可能会遇到网络或者其他的问题&#xff0c;可以添加淘宝镜像 npm install -g cnpm --registryhttps://registry.…