岛屿数量 (力扣) dfs + bfs JAVA

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:grid = [
[“1”,“1”,“1”,“1”,“0”],
[“1”,“1”,“0”,“1”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“0”,“0”,“0”]
]

输出:1

示例 2:

输入:grid = [
[“1”,“1”,“0”,“0”,“0”],
[“1”,“1”,“0”,“0”,“0”],
[“0”,“0”,“1”,“0”,“0”],
[“0”,“0”,“0”,“1”,“1”]
]

输出:3

提示:

m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 ‘0’ 或 ‘1’

解题思路:

1.每个岛屿由于有水的隔离所以与其他岛屿互不影响

2.每当发现一块陆地,可以先计数,再感染这个岛屿,代表已经来过,直到发现一个新的未被感染的岛屿再计数

3.可采用深度优先,与广度优先算法

在这里插入图片描述

dfs 代码:

class Solution {public int numIslands(char[][] grid) {if(grid.length == 0) return 0;int nums = 0;for(int i = 0; i < grid.length; i ++)//行数for(int j = 0; j < grid[0].length; j ++) {//列数if(grid[i][j] == '1'){nums ++;infect(grid, i, j);//计数 + 感染  } }return nums;}public static void infect(char a[][], int x, int y) {a[x][y] = '2';//感染int fx[] = {-1, 1, 0, 0};int fy[] = {0, 0, -1, 1};int fxx = 0, fyy = 0;for(int i = 0; i < 4; i ++) {fxx = fx[i] + x;fyy = fy[i] + y;if(fxx >= 0 && fxx < a.length && fyy >= 0 && fyy < a[0].length && a[fxx][fyy] == '1') infect(a, fxx, fyy);//要求本块是1,且相邻也为1才能感染}}
}

在这里插入图片描述

bfs 代码:

class Solution {public int numIslands(char[][] grid) {if(grid.length == 0) return 0;int nums = 0;for(int i = 0; i < grid.length; i ++)//行数for(int j = 0; j < grid[0].length; j ++) {//列数if(grid[i][j] == '1') {nums ++;infect(grid, i, j);   }}return nums;}public static void infect(char a[][], int x, int y) {a[x][y] = '2';Queue qux = new LinkedList<Integer>();Queue quy = new LinkedList<Integer>();qux.add(x);quy.add(y);int fx[] = {-1, 1, 0, 0};int fy[] = {0, 0, -1, 1};int fxx = 0, fyy = 0;while(!qux.isEmpty()) {x = (int)qux.peek();y = (int)quy.peek();for(int i = 0; i < 4; i ++) {fxx = x + fx[i];fyy = y + fy[i];if(fxx >= 0 && fxx < a.length && fyy >= 0 && fyy < a[0].length && a[fxx][fyy] == '1') {qux.add(fxx);quy.add(fyy);a[fxx][fyy] = '2';}}qux.poll();quy.poll();}}
}

在这里插入图片描述

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

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

相关文章

Spring Boot原理分析(一):项目启动(上)——@SpringBootApplication

文章目录 〇、准备工作一、SpringBootApplication.java源码解析1.源码2.自定义注解3.组合注解4.注解ComponentScan过滤器 5.注解SpringBootConfigurationConfiguration 6.注解EnableAutoConfiguration 本文章是Spring Boot源码解读与原理分析系列博客的第一篇&#xff0c;将会介…

阐述kubernetes部署:基础设施安装

基础设施部署 持久卷的建立 请参考&#xff1a;《持久卷的建立》 elasticsearch部署 一、设置远程扩展字典 不使用自定义字典请忽略此步骤 首先更改ES中IK插件的配置&#xff1a; vi/opt/kubernetes/es/IKAnalyzer.cfg.xml 按您的实际设置的秘钥配置secret_value&#xff1a; …

springboot+echarts +mysql制作数据可视化大屏(四图)

作者水平低&#xff0c;如有错误&#xff0c;恳请指正&#xff01;谢谢&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 项目简单&#xff0c;适合大学生参考 分类专栏还有其它的可视化博客哦&#xff01; 专栏地址&#xff1a;https://blog.csdn.net/qq_559…

操作系统12:I/O系统的功能、模型、接口及 I/O 设备和设备控制器

目录 1、I/O系统的功能、模型和接口 &#xff08;1&#xff09;I/O系统的基本功能 1.1 - 隐藏物理设备的细节 1.2 - 与设备的无关性 1.3 - 提高处理机和I/O设备的利用率 1.4 - 对 I/O 设备进行控制 1.5 - 确保对设备的正确共享 1.6 - 错误处理 &#xff08;2&#xff…

TCP/IP出现的背景及其历史【图解TCP/IP(笔记八)】

文章目录 TCP/IP出现的背景及其历史从军用技术的应用谈起ARPANET的诞生TCP/IP的诞生UNIX系统的普及与互联网的扩张商用互联网服务的启蒙 TCP/IP出现的背景及其历史 从军用技术的应用谈起 20世纪60年代&#xff0c;很多大学和研究机构都开始着力于新的通信技术。其中有一家以美…

DeepSpeed-Chat 打造类ChatGPT全流程 笔记二之监督指令微调

文章目录 系列文章0x0. 前言0x1. &#x1f415; Supervised finetuning (SFT) 教程翻译&#x1f3c3; 如何训练模型&#x1f3c3; 如何对SFT checkpoint进行评测?&#x1f481; 模型和数据☀️来自OPT-1.3B及其SFT变体&#xff08;使用不同微调数据&#xff09;的提示示例☀️…

你真的了解JS垃圾回收机制吗?

目录 前言 堆栈内存管理 JS垃圾回收机制 标记清除&#xff08;Mark and Sweep&#xff09; 标记阶段 清除阶段 标记清除的特点 优点 缺点 引用计数&#xff08;Reference Counting&#xff09; 引用计数器的维护 引用计数的跟踪 垃圾回收的触发 回收对象 引用计…

第23章:范式

一、范式 1.什么是范式 关于数据表设计的基本原则&#xff0c;规则就是范式NF。 2.范式都包括哪些&#xff1f; 第一范式&#xff08;1NF&#xff09;、第二范式&#xff08;2NF&#xff09;、第三范式&#xff08;3NF&#xff09;、巴斯-科德范式&#xff08;BCNF - Boyce…

消息队列黄金三剑客:RabbitMQ、RocketMQ和Kafka全面对决,谁是最佳选择?

1、应用场景 1.RabbitMQ&#xff1a; 适用于易用性和灵活性要求较高的场景 异步任务处理&#xff1a;RabbitMQ提供可靠的消息传递机制&#xff0c;适用于处理异步任务&#xff0c;例如将耗时的任务放入消息队列中&#xff0c;然后由消费者异步处理&#xff0c;提高系统的响应…

linux 如何挂载fat32格式u盘,如何挂载NTFS 文件系统的硬盘

linux系统默认可以识别fat32u盘&#xff0c;对ntfs格式u盘不能识别 具体挂载方式如下 1、插入u盘 2、mkdir /mnt/usb 此命令用于创建挂载u盘的目录&#xff0c;只需创建一次就可以&#xff0c;若已经存在则不需要再次创建 3、fdisk -l 找到u盘路径 上图显示的sdb1,sdb2,sdb5…

JMeter常用业务知识和组件(5)

这里写目录标题 一、信息头管理器1案例、测试开发平台登录接口2案例、测试平台获取测试用例接口 二、HTTP请求默认值案例1&#xff1a;实现登录接口测试 三、Cookie管理器&#xff08;有问题&#xff09;案例1&#xff1a;开源项目TPshop商城登录案例案例2&#xff1a;(有问题)…

常用数据回归建模算法总结记录

本文的主要目的是总结记录日常学习工作中常用到的一些数据回归拟合算法&#xff0c;对其原理简单总结记录&#xff0c;同时分析对应的优缺点&#xff0c;以后需要的时候可以直接翻看&#xff0c;避免每次都要查询浪费时间&#xff0c;欢迎补充。 (1)线性回归 (Linear Regressio…