每日一练:LeeCode-200、岛屿数量【DFS递归+BFS队列】

给你一个由 '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:DFS(系统栈=递归)

这题让求的是岛屿的数量,二维数组中值是1的都是岛屿,如果多个1是连着的,那么他们只能算一个岛屿

思路:

​ 最简单的一种方式就是遍历数组中的每一个值,如果是1就说明是岛屿,然后把它置为0或者其他的字符都可以,只要不是1就行,然后再遍历他的上下左右4个位置。如果是1,说明这两个岛屿是连着的,只能算是一个岛屿,我们还要把它置为0,然后再以它为中心遍历他的上下左右4个位置……。如果是0,就说明不是岛屿,就不在往他的上下左右4个位置遍历了。这里就以示例1为例来看一下

在这里插入图片描述

public int numIslands(char[][] grid) {//边界条件判断if (grid == null || grid.length == 0)return 0;//统计岛屿的个数int count = 0;//两个for循环遍历每一个格子for (int i = 0; i < grid.length; i++)for (int j = 0; j < grid[0].length; j++) {//只有当前格子是1才开始计算if (grid[i][j] == '1') {//如果当前格子是1,岛屿的数量加1count++;//然后通过dfs把当前格子的上下左右4//个位置为1的都要置为0,因为他们是连着//一起的算一个岛屿,dfs(grid, i, j);}}//最后返回岛屿的数量return count;
}//这个方法会把当前格子以及他邻近的为1的格子都会置为0
public void dfs(char[][] grid, int i, int j) {//边界条件判断,不能越界if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == '0')return;//把当前格子置为0,然后再从他的上下左右4个方向继续遍历grid[i][j] = '0';dfs(grid, i - 1, j);//上dfs(grid, i + 1, j);//下dfs(grid, i, j + 1);//左dfs(grid, i, j - 1);//右
}

方法2:BFS(队列)

DFS就是沿着一条路径一直走下去,当遇到终止条件的时候才会返回,而BFS就是先把当前位置附近
的访问一遍,就像下面这样先访问圈内的,然后再把圈放大继续访问
,就像下面这样

在这里插入图片描述
这题使用BFS和DFS都能解决,如果遇到位置为1的格子,只要能把他们挨着的为1的全部置为0,然后挨着的挨着的为1的位置也置为0,然后…一直这样循环下去,看下代码

public int numIslands(char[][] grid) {//边界条件判断if (grid == null || grid.length == 0)return 0;//统计岛屿的个数int count = 0;//两个for循环遍历每一个格子for (int i = 0; i < grid.length; i++)for (int j = 0; j < grid[0].length; j++) {//只有当前格子是1才开始计算if (grid[i][j] == '1') {//如果当前格子是1,岛屿的数量加1count++;//然后通过bfs把当前格子的上下左右4//个位置为1的都要置为0,因为他们是连着//一起的算一个岛屿,bfs(grid, i, j);}}return count;
}private void bfs(char[][] grid, int x, int y) {//把当前格子先置为0grid[x][y] = '0';int n = grid.length;int m = grid[0].length;//使用队列,存储的是格子坐标转化的值Queue<Integer> queue = new LinkedList<>();//我们知道平面坐标是两位数字,但队列中存储的是一位数字,//所以这里是把两位数字转化为一位数字int code = x * m + y;//坐标转化的值存放到队列中queue.add(code);while (!queue.isEmpty()) {//出队code = queue.poll();//在反转成坐标值(i,j)int i = code / m;int j = code % m;if (i > 0 && grid[i - 1][j] == '1') {//上//如果上边格子为1,把它置为0,然后加入到队列中//下面同理grid[i - 1][j] = '0';queue.add((i - 1) * m + j);}if (i < n - 1 && grid[i + 1][j] == '1') {//下grid[i + 1][j] = '0';queue.add((i + 1) * m + j);}if (j > 0 && grid[i][j - 1] == '1') { //左grid[i][j - 1] = '0';queue.add(i * m + j - 1);}if (j < m - 1 && grid[i][j + 1] == '1') {//右grid[i][j + 1] = '0';queue.add(i * m + j + 1);}}
}

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

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

相关文章

特种兵旅游-扬州、南京Citywalk

一、扬州 Day01 西安咸阳机场->扬州泰州机场&#xff08;扬州地界但是离泰州也嘎嘎近&#xff09;->大运河博物馆&#xff08;需要提前预约&#xff01;&#xff09;&#xff08;超级震撼&#xff09; Day02 瘦西湖&#xff08;门票有点贵&#xff0c;但是蛮值得&#x…

【微服务】Eureka(服务注册,服务发现)

文章目录 1.基本介绍1.学前说明2.当前架构分析1.示意图2.问题分析 3.引出Eureka1.项目架构分析2.上图解读 2.创建单机版的Eureka1.创建 e-commerce-eureka-server-9001 子模块2.检查父子pom.xml1.子 pom.xml2.父 pom.xml 3.pom.xml 引入依赖4.application.yml 配置eureka服务5.…

【数据结构刷题专题】—— 二叉树

二叉树 二叉树刷题框架 二叉树的定义&#xff1a; struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode(int x) : val(x), left(NULL), right(NULL); };1 二叉树的遍历方式 【1】前序遍历 class Solution { public:void traversal(TreeNode* node, vector&…

CI/CD 搭建jenkins基础测试环境构建项目(一)

Jenkins是一个开源的持续集成工具&#xff0c;可以帮助开发团队自动化构建、测试和部署他们的软件项目。通过Jenkins&#xff0c;开发团队可以实现快速、高效地交付软件&#xff0c;并及时发现和解决问题&#xff0c;从而提高团队的生产力和软件质量。持续集成/持续交付&#x…

后端常问面经之操作系统

请简要描述线程与进程的关系,区别及优缺点&#xff1f; 本质区别&#xff1a;进程是操作系统资源分配的基本单位&#xff0c;而线程是任务调度和执行的基本单位 在开销方面&#xff1a;每个进程都有独立的代码和数据空间&#xff08;程序上下文&#xff09;&#xff0c;程序之…

计算机网络面试题二

1.什么是计算机网络拓扑结构&#xff1f;计算机网络拓扑结构有哪五种基本形式&#xff1f; 计算机网络的拓扑结构是指网络中各个结点之间相互连接的几何形式。计算机网络拓扑结构的基本形式有&#xff1a;总线型网络、环形网络、星形网络、树形网络、网状网络。 2.什么是协议…

【【嵌入式开发 Linux 常用命令系列 1.4 -- grep -Ev 反向搜索】

文章目录 grep 的反向搜索 grep 的反向搜索 如果想从文件 a 中过滤掉包含字符串 “dash” 或 “tom” 的行&#xff0c;并将剩余的行写入到文件 b&#xff0c;可以使用 grep 命令配合正则表达式。使用 grep 的 -E 选项允许你指定一个扩展的正则表达式&#xff0c;而 -v 选项使…

C# 中Linq并行查询AsParallel 方法与Stopwatch类的理解与使用

AsParallel 是 C# 中的一个方法&#xff0c;它属于 System.Linq 命名空间下的 ParallelEnumerable 类。这个方法用于启用查询的并行执行。当你对一个数据集合执行 LINQ 查询时&#xff0c;通常这些查询是按顺序执行的。但是&#xff0c;当你调用 AsParallel 方法后&#xff0c;…

sql中添加数据的命令

SQL&#xff0c;全称是结构化查询语言&#xff08;Structured Query Language&#xff09;&#xff0c;是一种特殊目的的编程语言&#xff0c;主要用于数据库查询和程序设计。它允许用户存取数据、查询、更新和管理关系数据库系统。SQL是高级的非过程化编程语言&#xff0c;允许…

详解多模态 AI

2022 年 11 月&#xff0c;OpenAI 推出了 ChatGPT。它只用了几天时间就以其前所未有的能力席卷了世界。生成式人工智能革命已经开始&#xff0c;每个人都在问同一个问题&#xff1a;下一步是什么&#xff1f; 当时&#xff0c;ChatGPT 和许多其他由大型语言模型 &#xff08;L…

Acer宏碁暗影骑士擎AN515-58笔记本电脑工厂模式原厂Win11系统ISO镜像安装包下载

宏基AN515-58原装出厂OEM预装Windows11系统工厂包&#xff0c;恢复出厂时开箱状态一模一样&#xff0c;带恢复还原功能 链接&#xff1a;https://pan.baidu.com/s/1iCVSYtList-hPqbyTyaRqQ?pwdt2gw 提取码&#xff1a;t2gw 宏基原装系统自带所有驱动、NITROSENSE风扇键盘灯…

4.2 循环语句loop,等差数列求和

汇编语言 1. 循环语句loop loop指令的格式是&#xff1a;loop 标号&#xff0c;CPU执行loop指令的时候&#xff0c;要进行两部操作 cx cx - 1;判断cx中的值&#xff0c;不为0则转至标号处执行程序&#xff0c;如果为0则向下执行 循环使用loop来实现&#xff0c;循环次数存…

一文看尽Mac上运行Windows的所有可能:虚拟机、云电脑 更多

需求背景 大学期间我一直用的是windows,经历了从wind8到wind11的时代。 21年我转型干了产品,拿着surface、Thinkpad办公,生产力跟身边MacBook的同事相比大打折扣;于是我入手了一款macbook。一用上就回不了头,苹果的妙控键盘、触摸板真的是梦幻的办公组合。我本人也没有在…

04、Lua 数据类型

Lua 数据类型 Lua 数据类型nil&#xff08;空&#xff09;boolean&#xff08;布尔&#xff09;number&#xff08;数字&#xff09;string&#xff08;字符串&#xff09;table&#xff08;表&#xff09;function&#xff08;函数&#xff09;thread&#xff08;线程&#xf…

目标跟踪研究

我以前以为是靠高帧率实现目标识别的,现在才意识到目标跟踪也扮演着重要的角色 目录 1.目标跟踪问题简述2. 目标追踪综述3.目标跟踪-匈牙利匹配4.目标追踪-距离计算5.待续1.目标跟踪问题简述 目标跟踪 要实现跟踪,也就是需要了解前后帧之间的关系,那自然需要一个队列来保存…

vue中动态路由是什么该如何实现

在 Vue 中&#xff0c;动态路由是指根据不同的参数或条件&#xff0c;生成不同的路由配置。实现动态路由可以通过以下步骤&#xff1a; 1. **定义动态路由规则**&#xff1a; - 在路由配置文件&#xff08;通常是 router/index.js&#xff09;中&#xff0c;使用路由的 pat…

Typora结合PicGo + Github搭建个人图床

目录 一 、GitHub仓库设置 1、新建仓库 2、创建Token 并复制保存 二、PicGo客户端配置 1、下载 & 安装 2、配置图床 三、Typora配置 一 、GitHub仓库设置 1、新建仓库 点击主页右上角的 号创建 New repository 填写仓库信息 2、创建Token 并复制保存 点击右上角…

神经网络深度学习梯度下降算法优化

【神经网络与深度学习】以最通俗易懂的角度解读[梯度下降法及其优化算法]&#xff0c;这一篇就足够&#xff08;很全很详细&#xff09;_梯度下降在神经网络中的作用及概念-CSDN博客 https://blog.51cto.com/u_15162069/2761936 梯度下降数学原理

JavaSE(上)-Day10

JavaSE&#xff08;上&#xff09;-Day10 多态多态中成员变量的调用多态中成员方法的调用多态的优缺点 包final关键字权限访问修饰符代码块 多态 什么是多态&#xff1a;对象的多种形态多态的前提是&#xff1a;有继承或实现关系&#xff1b;子类重写父类的方法&#xff0c;父…

QGraphicsView实现图片放大、缩小、鼠标拖动、以鼠标点放大缩小

1. 工程配置文件 pro 1 QT core gui2 3 greaterThan(QT_MAJOR_VERSION, 4): QT widgets4 5 CONFIG c116 7 # The following define makes your compiler emit warnings if you use8 # any Qt feature that has been marked deprecated (the exact warnings9 # depend…