当前位置: 首页 > news >正文

左神学习笔记-岛屿数量问题(java版算法)

目录

  • 1. 问题描述
  • 2. 解决方法
  • 3. 拓展进阶问题
  • 4. 参考链接

1. 问题描述

题目:一个矩阵中只有0和1两个值,每个位置都可以和自己的上下左右四个位置相连,如果有一片1连在一起,这一部分叫做一个岛,求一个矩阵中有多少岛?

0 0 0 0 0 0 0 0 
1 0 0 1 0 1 1 1
1 0 0 1 0 1 0 0
1 0 0 1 0 1 0 0
1 1 1 1 0 0 1 1 
0 0 0 0 0 0 0 0

总共有三个岛

2. 解决方法

我们使用感染的方法进行解决
思路:首先遍历数组,遇到1的话,对其进行感染,判断其上下左右是否有1,将其变为2,随后对周围的1进行感染,直到周围没有1,进行向下遍历,循环该步骤,直到全部遍历完成。

编写代码:

public class Code03_Islands {public static int countIslands(int[][] m){if(m == null || m[0] == null){return 0;}int N = m.length;int M = m[0].length;int res = 0;for(int i = 0; i < N; i++){for(int j = 0; j < M; j++){if(m[i][j] == 1){res ++;infect(m,i,j,N,M);}}}return res;}// 感染函数public static void infect(int[][] m, int i, int j, int N, int M){// 我不是岛,进行返回if(i < 0|| i >= N || j < 0 || j >= M || m[i][j] != 1){return;}// 设置为不能再次被遍历m[i][j] = 2;// 进行判断infect(m, i + 1, j, N, M);infect(m, i - 1, j, N, M);infect(m, i, j + 1, N, M);infect(m, i, j - 1, N, M);}public static void main(String[] args){int[][] m1 = {{0, 0, 1, 0, 0, 0, 0, 0},{0, 1, 1, 0, 0, 1, 1, 0}};System.out.println(countIslands(m1));}
}

3. 拓展进阶问题

如何设计一个并行算法解决这个问题?
意思是,如果你有两个cpu来处理这个问题,对这个数组进行遍历,如何计算岛的个数

0 0 0 0 0 0 0 0 
1 0 0 1 0 1 1 1 这部分由cpu1处理
1 0 0 1 0 1 0 0
-----------------
1 0 0 1 0 1 0 0
1 1 1 1 0 0 1 1 这部分由cpu2处理
0 0 0 0 0 0 0 0

我们可以直观的看出这是三个岛,但是分给两个cpu进行计算的话,上半部分单独给cpu1进行计算的话,就得到数量3,下半部分单独给cpu2进行计算的话,也就得到数量3,该如何得到正确的数量呢?

这里我们使用并查集的方法进行计算,判断他们的根是否相同。
并查集的知识在这里就不进行科普了,后面放几个链接供大家学习。
通过画图,cpu1会得到三个树,cpu2会得到三个树,我们使用并查集对其进行判断,判断树与树是否相接,如果相接,就划分到一个集合,最后查看有几个集合,就能判断有多少个岛了。
在这里插入图片描述
在这里插入图片描述

4. 参考链接

【算法与数据结构】—— 并查集
并查集
一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 堆排序以及向上、向下调整算法的时间复杂度推导及实现(超详细)
  • 五种创建springBoot项目的方法(本质上是三种)
  • FFmpeg学习
  • C语言从头学44——I/O 函数(一)
  • 软件测试生命周期、BUG描述与处理策略
  • leetcode面试算法题
  • Java程序员接单分享
  • Redis远程字典服务器(1)—— 初识Redis
  • SSH协议管理多主机(SSH协议的两种用法、生产环境用户初始化、结果返回值处理)
  • 人工智能算法工程师(高级)课程11-自然语言处理之NLP的语言模型-seq2seq模型,seq+注意力与代码详解
  • 【数据结构】链表篇
  • 深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告
  • 基于STM32的智能宠物喂食器
  • MySQL的索引事务和JDBC编程
  • QT(2.0)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • HTTP那些事
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • Mithril.js 入门介绍
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • PaddlePaddle-GitHub的正确打开姿势
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • springboot_database项目介绍
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • XForms - 更强大的Form
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 程序员该如何有效的找工作?
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 关于Java中分层中遇到的一些问题
  • 前嗅ForeSpider教程:创建模板
  • 实习面试笔记
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • python最赚钱的4个方向,你最心动的是哪个?
  • ​VRRP 虚拟路由冗余协议(华为)
  • #微信小程序:微信小程序常见的配置传旨
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $GOPATH/go.mod exists but should not goland
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (1)svelte 教程:hello world
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (力扣)循环队列的实现与详解(C语言)
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)RocketMQ初步认识
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • .net Application的目录
  • .NET gRPC 和RESTful简单对比
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET单元测试
  • // an array of int