面试算法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.rhkb.cn/news/237244.html

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

相关文章

如何将.NET 8.0的ASP.NET Core Web API部署成Windows服务

写在前面 前面写了一篇关于将.NET应用转换成Windows服务的方法&#xff0c;其实真正的目的是为了探索如何将Asp.Net Core Web Api 部署成Windows 服务。基于上一篇的基础&#xff0c;只需把创建 WebApplication 的代码放到 BackgroundService 的ExecuteAsync方法中即可。 其中…

【重学C语言】二、前期准备和第一个C程序

【重学C语言】二、前期准备和第一个C程序 1. VS 项目1.1 创建项目 2. Clion 项目(本博主主用)2.1 创建项目2.2 Clion 配置 3. 构建类型4. 构建模式5. 注释6. 第一个 C 程序7. 程序闪退8. 新手遇到的问题 1. VS 项目 1.1 创建项目 打开 VS 创建新项目 创建 main.c 书写以下…

高精度彩色3D相机:开启崭新的彩色3D成像时代

3D成像的新时代 近年来&#xff0c;机器人技术的快速发展促使对3D相机技术的需求不断增加&#xff0c;原因在于&#xff0c;相机在提高机器人的性能和实现多种功能方面发挥了决定性作用。然而&#xff0c;其中许多应用所需的解决方案更复杂&#xff0c;仅提供环境的深度信息是…

SQL语句案例

1、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩 分析&#xff1a; 平均 avg---GROUP BY分组 从高到低--ORDER BY 所有学生的所有课程的成绩---行转列 所有学生----外联&#xff08;所有&#xff09;----RIGHT JOIN右联 SELECT s.sid, s.sname , 不…

linux 如何创建文件

我们在写一些教程的时候&#xff0c;经常会需要创建一些用于演示的文档&#xff0c;这些文档往往需要填充一些不特定的内容。那么如何快速的创建演示用的文档呢&#xff1f; docfaker.py docfaker.py是一个py脚本&#xff0c;用于创建一个简单的txt文档&#xff0c;docfaker.…

简单工厂模式、工厂方法、抽象工厂模式

下面例子中鼠标&#xff0c;键盘&#xff0c;耳麦为产品&#xff0c;惠普&#xff0c;戴尔为工厂。 简单工厂模式 简单工厂模式不是 23 种里的一种&#xff0c;简而言之&#xff0c;就是有一个专门生产某个产品的类。 比如下图中的鼠标工厂&#xff0c;专业生产鼠标&#xf…

基于springboot+vue2的课程教学考试系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

[情商-11]:人际交流的心理架构与需求层次模型

目录 前言&#xff1a; 一、心理架构 1.1 个体生理层 1.2 个体心理层 1.3 点对点人际交流层 1.4 社会网络层 1.5 社会价值层 二、人的需求层次模型 2.1 需求&#xff08;欲望&#xff09;层次模型 2.2 基因与人需求之间的关系 2.3 个体生理需求 2.4 个体的心理需求…

Unity——VContainer的依赖注入

一、IOC控制反转和DI依赖倒置 1、IOC框架核心原理是依赖倒置原则 C#设计模式的六大原则 使用这种思想方式&#xff0c;可以让我们无需关心对象的生成方式&#xff0c;只需要告诉容器我需要的对象即可&#xff0c;而告诉容器我需要对象的方式就叫做DI&#xff08;依赖注入&…

leetcode刷题记录18(2023-08-29)【最短无序连续子数组(单调栈) | 合并二叉树(dfs) | 任务调度器(桶) | 回文子串(二维dp)】

581. 最短无序连续子数组 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 示例 1&#xff1a; 输入&am…

IT从业人员如何养生?

目前&#xff0c;电脑对人体生理和心理方面的负面影响已日益受到人们的重视。为此科学使用电脑&#xff0c;减少电脑和网络的危害是十分必要的。好代码网总结了一些it从业人员的保健知识&#xff0c;分享给大家。 一是要增强自我保健意识 工作间隙注意适当休息&#xff0c;一般…

试用 Coroot,一个基于 eBPF 的可观测性工具,用于 Kubernetes 等

在本文中&#xff0c;我们将介绍 Coroot&#xff0c;这是一个使用 eBPF 技术构建的开源工具&#xff0c;旨在用于 Kubernetes 或基于 Docker/containerd 的环境&#xff0c;甚至是非容器化应用程序。Coroot 收集和分析遥测数据&#xff08;指标、日志、跟踪和配置文件&#xff…

遥感影像-语义分割数据集:高分卫星-云数据集详细介绍及训练样本处理流程

原始数据集详情 简介&#xff1a;该云数据集包括RGB三通道的高分辨率图像&#xff0c;包含高分一、高分二及宽幅数据集。 KeyValue卫星类型高分系列覆盖区域未知场景未知分辨率1m、2m、8m数量12000单张尺寸1024*1024原始影像位深8位标签图片位深8位原始影像通道数三通道标签图…

Backtrader 文档学习-Strategy with Signals

Backtrader 文档学习-Strategy with Signals backtrader可以不通过重写策略的方式触发交易&#xff0c;尽管重写策略是首选通用的方式。 下面介绍通过使用信号也是可以实现交易触发的。 1.定义signal import backtrader as btdata bt.feeds.OneOfTheFeeds(datanamemydatana…

HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器&#xff1a;定义组件重用样式 Extend装饰器&#xff1a;定义扩展组件样式 5、HarmonyOS 应用开发…

Netty-Netty组件了解

EventLoop 和 EventLoopGroup 回想一下我们在 NIO 中是如何处理我们关心的事件的&#xff1f;在一个 while 循环中 select 出事 件&#xff0c;然后依次处理每种事件。我们可以把它称为事件循环&#xff0c;这就是 EventLoop 。 interface io.netty.channel. EventLoo…

权值初始化

一、梯度消失与爆炸 在神经网络中&#xff0c;梯度消失和梯度爆炸是训练过程中常见的问题。 梯度消失指的是在反向传播过程中&#xff0c;梯度逐渐变小&#xff0c;导致较远处的层对参数的更新影响较小甚至无法更新。这通常发生在深层网络中&#xff0c;特别是使用某些激活函…

TDengine 签约西电电力

近年来&#xff0c;随着云计算和物联网技术的迅猛发展&#xff0c;传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上&#xff0c;电力行业构建了信息网络、通信网络和能源网络&#xff0c;致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…

用C#实现简单的线性回归

前言 最近注意到了NumSharp&#xff0c;想学习一下&#xff0c;最好的学习方式就是去实践&#xff0c;因此从github上找了一个用python实现的简单线性回归代码&#xff0c;然后基于NumSharp用C#进行了改写。 NumSharp简介 NumSharp&#xff08;NumPy for C#&#xff09;是一…

[redis] redis主从复制,哨兵模式和集群

一、redis的高可用 1.1 redis高可用的概念 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 高可用的计算公式是1-&#xff08;宕机时间&#xff09;/&#xff08;宕机时…