面试算法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.mzph.cn/news/609079.shtml

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

相关文章

山东名岳轩印刷包装携专业包装袋盛装亮相2024济南生物发酵展

山东名岳轩印刷包装有限公司盛装亮相2024第12届国际生物发酵展&#xff0c;3月5-7日山东国际会展中心与您相约&#xff01; 展位号&#xff1a;1号馆F17 山东名岳轩印刷包装有限公司是一家拥有南北两个生产厂区&#xff0c;设计、制版、印刷&#xff0c;营销策划为一体的专业…

JavaSec基础 反射修改Final修饰的属性及绕过高版本反射限制

反射重拾 半年没碰java了 先写点基础回忆一下 反射弹计算器 public class Test {public static void main(String[] args) throws Exception {Class<?> clazz Class.forName("java.lang.Runtime");clazz.getDeclaredMethod("exec", String.cla…

springBoot-自动配置原理

以下笔记内容&#xff0c; 整理自B站黑马springBoot视频&#xff0c;抖音Holis 1、自动配置原理 1.收集Spring开发者的编程习惯&#xff0c;整理开发过程使用的常用技术列表一>(技术集A) 2.收集常用技术(技术集A)的使用参数&#xff0c;整理开发过程中每个技术的常用设置列表…

灵活轻巧的java接口自动化测试实战

前言 无论是自动化测试还是自动化部署&#xff0c;撸码肯定少不了&#xff0c;所以下面的基于java语言的接口自动化测试&#xff0c;要想在业务上实现接口自动化&#xff0c;前提是要有一定的java基础。 如果没有java基础&#xff0c;也没关系。这里小编也为大家提供了一套jav…

U盘、硬盘无法打开,修复RAW磁盘或分区,硬盘变成raw格式如何恢复,数据恢复

本文持续更新&#xff0c;针对遇到的数据丢失问题进行详细记录 磁盘变成RAW的可能原因 突然断电或关机文件系统丢失或损坏病毒或恶意软件感染坏扇区磁盘损坏 以下解决方案针对非病毒损坏 通过Windows自带的工具进行恢复&#xff08;CHKDSK命令&#xff09; 1.连接硬盘 2.…

springcloud bus消息总线

简介 Spring Cloud Bus 配合Spring Cloud Config 使用可以实现配置的动态刷新。 Spring Cloud Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架&#xff0c;它整合了Java的事件处理机制和消息中间件的功能。Spring Clud Bus目前支持RabbitMQ和Kafka。 Spring C…

TDengine 被 Frost Sullivan 评为全球最佳工业数据管理解决方案

近日&#xff0c;TDengine 被国际知名咨询公司沙利文&#xff08;Frost & Sullivan&#xff09;评为全球最佳工业数据管理解决方案&#xff0c;赢得了 2023 年客户价值领导力奖&#xff08;Frost & Sullivan duoxie&#xff09;&#xff0c;该奖项重点关注引领行业创新…

这些开源自动化测试框架,会用等于白嫖一个w

作者&#xff1a;黑马测试 链接&#xff1a;https://www.zhihu.com/question/19923336/answer/2585952461 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 随着计算机技术人员的大量增加&#xff0c;通过编写代码来…

设计模式——工厂方法模式(Factory Method Pattern)

简单工厂模式 概述 说工厂方法模式之前&#xff0c;先说下简单工厂模式&#xff0c;简单工厂模式并不属于GoF 23个经典设计模式&#xff0c;但通常将它作为学习其他工厂模式的基础&#xff0c;它的设计思想很简单&#xff0c;其基本流程如下&#xff1a;首先将需要创建的各种不…

顺序栈之共享栈实现——C语言

参考书&#xff1a;数据结构教程 第5版 李葆春 P83 #include <stdio.h> #include <string.h> #include <stdlib.h>#define MaxSize 10/*共享栈*/ typedef struct {char data[MaxSize];int top1,top2,len; }DStack;/*初始化*/ void InitStack(DStack *s){s-…

【Huggingface】如何访问Huggingface,Huggingface镜像

镜像站&#xff1a; https://hf-mirror.com/本站域名 hf-mirror.com&#xff0c;用于镜像 huggingface.co 域名。 更多用法&#xff08;多线程加速等&#xff09;详见这篇文章。简介&#xff1a; 方法一&#xff1a;使用huggingface 官方提供的 huggingface-cli 命令行工具。…

解决不同请求需要的同一实体类参数不同(分组校验validation)

问题概述 新增目录是自动生成id&#xff0c;不需要id参数&#xff1b;更新目录需要id&#xff0c;不能为空 pom.xml中已有spring-boot-starter-validation依赖 <!--validation(完成属性限制&#xff0c;参数校验)--><dependency><groupId>org.springframew…

“揭秘性能测试工具:优化软件性能的关键秘籍“

性能测试工具的设计宗旨是为了模拟用户对软件应用程序或系统的各种操作&#xff0c;旨在评估关键的性能指标&#xff0c;包括响应时间、吞吐量、并发能力和资源利用率。 通过这些工具模拟的多用户环境&#xff0c;我们能够产生与实际工作负载相似的条件&#xff0c;并监测系统…

业界首款PCIe 4.0/5.0多通道融合接口SSD技术解读

之前小编写过一篇文章劝大家不要碰PCIe 5.0 SSD&#xff0c;详细内容&#xff0c;可以再回顾下&#xff1a; 扩展阅读&#xff1a;当下最好不要入坑PCIe 5.0 SSD 如果想要进一步了解PCIe 6.0&#xff0c;欢迎点击阅读&#xff1a; 浅析PCIe 6.0功能更新与实现的挑战 PCIe 6.…

pyqt调用UI和开启子进程

UI制作 qrc 注意调用UI前把样式表里绑定的资源(qrc)转换成py导入进去 xxx.qrc转xxx.py 两种方法 1命令 pyrcc5 -o icons_rc.py icons.qrc 2外部工具pyrcc 实参 -o $FileNameWithoutExtension$.py $FileNameWithoutExtension$.qrcsdz.qrc→→sdaz.py 在代码里写 import…

Influxdb2修改管理员密码

通过恢复管理员令牌来重置InfluxDB2管理员的密码 1.找到数据库的配置文件 一般为config.json 2.配置文件的的blod文件配置 3.在这个混合文本和二进制json文件中搜索已知的用户名或token之类的字符串。 例如&#xff1a; "id":"0bd73badf2941000","…

AI-数学-高中-3.二次函数的根的分布问题的解题方法

原作者学习视频&#xff1a;二次】3二次函数根分布问题&#xff08;中档&#xff09;_哔哩哔哩_bilibili 一、伟达定理&#xff08;根与0比较的二次函数&#xff09; 示例&#xff1a; 二、画图法&#xff1a; 1.开口方向的确定&#xff0c;有的示例可能存在向上、下两种情况…

Centos7 手动更改系统时间

文章目录 1.更改系统时间2.写入系统时间3.查看是否写入成功 1.更改系统时间 date -s "2017-12-18 09:40:00"2.写入系统时间 hwclock -w3.查看是否写入成功 timedatectl

初识硬件之三极管

1 什么是三极管 概述 三极管全称是“晶体三极管”&#xff0c;也被称作“晶体管”&#xff0c;是一种具有放大功能的半导体器件。通常指本征半导体三极管&#xff0c;即BJT管。 三极管封装 有插件和贴片之分 如下图左一和左二就是插件形式&#xff0c;上面的金属片和洞孔是…

服务器中了DevicData勒索病毒怎么处理

DevicData勒索病毒是最近一段时间非常流行的勒索病毒类型&#xff0c;有很多企业都不幸中招&#xff0c;给生产和经营带来了很大的影响。所以云天数据恢复中心决定就这种类型的勒索病毒&#xff0c;来和各位讲讲当服务器中了DevicData勒索病毒怎么处理。 特征 1&#xff0c;文件…