数据结构和算法:深度优先搜索 (DFS) 和广度优先搜索 (BFS) 相关题目

文章目录

    • 1. 岛屿问题(岛屿连通)
      • 1.1 岛屿数量
        • 1.1.1 DFS 解法
        • 1.1.2 BFS 解法

深度优先搜索 (DFS) 和广度优先搜索 (BFS)是比较难的算法问题,但也是面试常考题,因此需要认真研究并掌握。

DFS 用递归实现,BFS用栈实现

1. 岛屿问题(岛屿连通)

1.1 岛屿数量

LeetCode链接:LeetCode 200. 岛屿数量

题目:

给你一个由 ‘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

1.1.1 DFS 解法

code:

class Solution:def numIslands(self, grid: List[List[str]]) -> int:# dfs 用递归实现def dfs(i,j):if not 0<=i<len(grid) or not 0<=j<len(grid[0]) or grid[i][j]!="1":return# 遍历完(i,j)后将其标记为水,防止重复搜索grid[i][j]="0"vectors=([i,j+1],[i-1,j],[i,j-1],[i+1,j])for vector in vectors:dfs(vector[0],vector[1])num=0for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j]=="1":dfs(i,j)num+=1return num

1.1.2 BFS 解法

将 BFS 写成函数的代码写法:

class Solution:def numIslands(self, grid: List[List[str]]) -> int:# 通过bfs将搜索过的节点标记为“0”# bfs通过栈实现(先进先出)def bfs(i,j):if not 0<=i<len(grid) or not 0<=j<len(grid[0]) or grid[i][j]!="1":returnstack.append([i,j])grid[i][j]="0"while stack:stack.pop(0)vectors=([i,j+1],[i-1,j],[i,j-1],[i+1,j])for vector in vectors:bfs(vector[0],vector[1])num=0for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j]=="1":stack=[]bfs(i,j)num+=1return num

使用迭代而非函数的 BFS 写法:

class Solution:def numIslands(self, grid: List[List[str]]) -> int:num=0for i in range(len(grid)):for j in range(len(grid[0])):if grid[i][j]=="1":# bfs通过栈实现(先进先出)# deque 是双向队列,可以高效的在队列头部和尾部添加、删除元素deque=collections.deque([[i,j]])grid[i][j]="0"     # 将搜索过的节点标记为“0”while deque:row,col=deque.popleft()vectors=([row,col+1],[row-1,col],[row,col-1],[row+1,col])for vector in vectors:if 0<=vector[0]<len(grid) and 0<=vector[1]<len(grid[0]) and grid[vector[0]][vector[1]]=="1":deque.append(vector)grid[vector[0]][vector[1]]="0"    # 将搜索过的节点标记为“0”num+=1return num

注:

在使用先入先出栈时,应优先使用 collections.deque() 而非 list

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

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

相关文章

使用 SageMaker 对 Whisper 模型进行微调及部署

使用 SageMaker 对 Whisper 模型进行微调及部署 Whisper 作为 OpenAI 最新开源的自动语音识别&#xff08;ASR&#xff09;模型&#xff0c;采用了编码器-解码器&#xff08;encoder- decoder&#xff09;transformer架构&#xff0c;并使用了 68 万小时的从互联网收集的多语言…

PersistentVolume:怎么解决数据持久化

Kubernetes 的 Volume 对数据存储已经给出了一个很好的抽象&#xff0c;它只是定义了有这么一个“存储卷”&#xff0c;而这个“存储卷”是什么类型、有多大容量、怎么存储&#xff0c;我们都可以自由发挥。Pod 不需要关心那些专业、复杂的细节&#xff0c;只要设置好 volumeMo…

安卓APK反编译+修改+重打包+签名

目录 1.下载反编译工具包。2.将APK包&#xff0c;重命名为ZIP&#xff0c;解压。放到反编译根目录下。3.使用apktool反编译修改smail文件&#xff0c;进行重打包4.重新打包5.重签名 1.下载反编译工具包。 反编译工具包地址&#xff1a;百度网盘 提取码&#xff1a;dsu3 解压后…

AtcoderABC243场

A - Shampoo A - Shampoo ] 题目大意 高桥家有三个人&#xff1a;高桥、他的父亲和他的母亲。每个人每晚都在浴室洗头发。他们按照顺序使用AA、BB和CC毫升的洗发水。 问&#xff0c;今天早上瓶子里有VV毫升的洗发水。在不重新装满的情况下&#xff0c;谁会第一个用完洗发水洗头…

网工内推 | 美图秀秀招网工,大专以上,15薪,NP认证优先

01 美图公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、美图大厦网络、分公司网络、IT相关项目的网络、办公内网服务器&#xff1b; 2、负责网络的设计、运行、管理和维护等工作&#xff1b; 3、负责远程办公环境的优化、运行、管理和维护工作&#xff1b; 4、…

python匿名函数Lambda

1、Lambda 函数简介 Lambda函数也被称为匿名(没有名称)函数&#xff0c;它直接接受参数的数量以及使用该参数执行的条件或操作&#xff0c;该参数以冒号分隔&#xff0c;并返回最终结果。为了在大型代码库上编写代码时执行一项小任务&#xff0c;或者在函数中执行一项小任务&a…

git merge详细用法

git merge用法 一、开发分支&#xff08;dev&#xff09;上的代码达到上线的标准后&#xff0c;要合并到 master 分支 git checkout dev git pull git checkout master git merge dev git push -u origin master二、当master代码改动了&#xff0c;需要更新开发分支&#xff…

吴恩达机器学习2022-Jupyter-用scikitlearn实现线性回归

1可选实验:使用Scikit-Learn进行线性回归 有一个开源的、商业上可用的机器学习工具包&#xff0c;叫做 scikit-learn。本工具包包含您将在本课程中使用的许多算法的实现。 1.1工具 您将利用 scikit-learn 以及 matplotlib 和 NumPy 中的函数。 2线性回归封闭式解决方案 Sc…

nvm常用命令

查看node.js的所有版本&#xff1a; npm view node versions 查看 nvm 是否安装成功&#xff1a; command -v nvm查看当前使用的 Node 版本&#xff1a; node -v将安装 12.7.0 版本的Node&#xff1a; nvm install 12.7.0卸载 12.7.0 版本的Node&#xff1a; nvm uninstall 12…

为什么低代码只能掀起小浪花?了解低代码的得失与前景

导语&#xff1a;低代码是相对于高代码和无代码的一个中间概念&#xff0c;通常强调的是用户不需要学习如何写代码&#xff0c;就能完成工作。然而低代码模式一直不温不火&#xff0c;原因是什么呢&#xff1f;一起来看一下吧。 最近互联网大公司裁员消息又起&#xff0c;“低代…

Linux 配置常见服务器命令

Linux常见配置服务器的命令整理&#xff0c;基于Centos 7 。 基本操作命令 查看ens33 ip ifconfig ens33 查看系统版本 cat /etc/redhat-release 查找文件install.log、httpd.conf、hosts、smb.conf、network find -name te.txt 使用“cp 源文件 目标文件”命令进行复制 cp t…

Serial/TCP/NTRIP通信

1 串口通信 串口通讯 串口通信详解 串口通信中的4大参数含义 Qt 串口通信的简单demo 2 TCP通信 TCP协议简介 TCP协议详细介绍 TCP协议(全面) IP地址和端口号的详解 3 NTRIP通信 Ntrip通讯协议1.0 什么是Ntrip&#xff1f;Ntrip协议简介 TCP高并发数据转接服务器&#xff0…

【ElasticSearch】java 如何连接 elasticsearch

不同版本的java 与 Elastic 如何连接。 在 es 与 java 连接中最重要的就是『兼容性矩阵」&#xff0c;要严格按照兼容性矩阵的要求来部署 spring boot 或者 es的版本&#xff0c;否则会有意向不到的错误或者程序无法运行等等。 针对 es 6.2.2&#xff0c;java 客户端的配置代…

Linux: cannot read file data

报错&#xff1a; Could not load library libcudnn_cnn_infer.so.8. Error: /home/qc/miniconda3/envs/DNAqc/lib/python3.10/site-packages/torch/lib/libcudnn_cnn_infer.so.8: cannot read file data Please make sure libcudnn_cnn_infer.so.8 is in your library path! A…

【NLP】国外新动态--LLM模型

一、说明 NLP走势如何?这是关于在实践中使用大型语言模型(LLM)的系列文章中的一篇文章。在这里,我将介绍LLM,并介绍使用它们的3个级别。未来的文章将探讨LLM的实际方面,例如如何使用OpenAI的公共API,Hugging Face Transformers Python库,如何微调LLM,以及如何从头开始…

navicate_windows_14

1.新建文本文档2.输入如下内容 echo off set dnInfo set dn2ShellFolder set rpHKEY_CURRENT_USER\Software\Classes\CLSID :: reg delete HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium\Registration14XCS /f %针对<strong><font color"#FF0000"…

Android 进阶之旅 - 终章

我们的《Android进阶之旅》到这里就算是完结了&#xff0c;五六年的时间&#xff0c;我的青春&#xff0c;我职业生涯的黄金时期&#xff0c;基本都耗在了这上面。很多东西我都是现学现卖&#xff0c;平时上班也很少有时间能备课&#xff0c;很多地方难免讲得不如意&#xff0c…

ChatGpt+人工修正 PyQt5 实现简易视频播放器

支持功能: 1. 视频播放速度调整 2. 视频声音调整 3. 视频当前播放帧截帧(用的ffmpeg 怎么装自己百度去,截取准确度很高,QT自带的截帧那玩意信号不触发,不好使) 4. 视频暂停 # !/usr/bin/env python3 # -*- coding: UTF-8 -*- """ @author : v_jiaohaich…

SQL Server的derived table 临时表

例子1&#xff1a; 创建一个查询 SELECT ProductID, Name, ListPrice, CASE WHEN ListPrice > 1000 THEN NHigh ELSE NNormal END AS PriceType FROM SalesLT.Product 为了进一步查询&#xff0c;而又不增加它的复杂度。这时&#xff0c;可以创建一个derived table。 …

华为产品测评官-开发者之声 - ModelArts 真实体验感想

华为产品测评官&#xff0d;开发者之声 - ModelArts 真实体验感想 我先是在6月17日参加了华为在深圳举办的开发者大会&#xff0c;后面看到群里发的"2023华为产品测评官&#xff0d;开发者之声"活动&#xff0c;简单看了一下体验活动的具体事情&#xff0c;感觉好玩…