【经典LeetCode算法题目专栏分类】【第9期】深度优先搜索DFS与并查集:括号生成、岛屿问题、扫雷游戏

 《博主简介》

小伙伴们好,我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。
更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】

DFS

括号生成

DFS

class Solution:

    def generateParenthesis(self, n: int) -> List[str]:

        def DFS(left, right, s):

            if left == n and right == n:

                res.append(s)

                return

            if left < n:

                DFS(left+1,right,s+'(')

            if right < left:

                DFS(left,right + 1,s+')')

        res = []

        DFS(0,0,'')

        return res

BFS

class Node:

    def __init__(self, left, right, s):

        self.left = left

        self.right = right

        self.s = s

class Solution:

    def generateParenthesis(self, n: int) -> List[str]:

        # BFS写法

        res = []

        if n == 0:

            return res

        queue = [Node(n,n,'')]

        while queue:

            node = queue.pop(0)

            if node.left == 0 and node.right == 0:

                res.append(node.s)

            if node.left > 0:

                queue.append(Node(node.left-1, node.right, node.s+'('))

            if node.right > 0 and node.right > node.left:

                queue.append(Node(node.left, node.right-1, node.s+')'))

        return res

# 写法2:

class Solution:

    def generateParenthesis(self, n: int) -> List[str]:

        # BFS写法

        res = []

        if n == 0:

            return res

        queue = [(n,n,'')]

        while queue:

            node = queue.pop(0)

            if node[0] == 0 and node[1] == 0:

                res.append(node[2])

            if node[0] > 0:

                queue.append((node[0]-1, node[1], node[2]+'('))

            if node[1] > 0 and node[1] > node[0]:

                queue.append((node[0], node[1]-1, node[2]+')'))

        return res

通常搜索几乎都是用深度优先遍历(回溯算法)。

广度优先遍历,得自己编写结点类,显示使用队列这个数据结构。深度优先遍历的时候,就可以直接使用系统栈,在递归方法执行完成的时候,系统栈顶就把我们所需要的状态信息直接弹出,而无须编写结点类和显示使用栈。

将BFS写法中的pop(0)改为pop()即为深度优先的迭代形式。

对比迭代的BFS写法与递归的DFS写法,可以看到,BFS其实是将DFS的参数当做队列中的一个元素来进行处理罢了,其他的与DFS没有什么区别。

并查集

岛屿问题

class Solution:

    def numIslands(self, grid: List[List[str]]) -> int:

        self.m = len(grid)

        self.n = len(grid[0])

        res = 0

        for i in range(self.m):

            for j in range(self.n):

                if grid[i][j] == '1':

                    self.sink(i,j,grid)

                    res += 1

        return res

    

    def sink(self, i, j, grid):

        grid[i][j] = '0'

        for ni,nj in [(i-1,j),(i+1,j),(i,j-1),(i,j+1)]:

            if 0<=ni<self.m and 0<=nj<self.n and grid[ni][nj] == '1':

                self.sink(ni,nj,grid)

扫雷游戏

# DFS

class Solution:

    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:

        # DFS

        i, j = click

        row, col = len(board), len(board[0])

        if board[i][j] == "M":

            board[i][j] = "X"

            return board

        # 计算空白快周围的雷数量

        def cal(i, j):

            res = 0

            for x in [1, -1, 0]:

                for y in [1, -1, 0]:

                    if x == 0 and y == 0: continue

                    if 0 <= i + x < row and 0 <= j + y < col and board[i + x][j + y] == "M": res += 1

            return res

        def dfs(i, j):

            num = cal(i, j)

            if num > 0:

                board[i][j] = str(num)

                return

            board[i][j] = "B"

            for x in [1, -1, 0]:

                for y in [1, -1, 0]:

                    if x == 0 and y == 0: continue

                    nxt_i, nxt_j = i + x, j + y

                    if 0 <= nxt_i < row and 0 <= nxt_j < col and board[nxt_i][nxt_j] == "E": dfs(nxt_i, nxt_j)

        dfs(i, j)

        return board

# BFS

class Solution:

    def updateBoard(self, board: List[List[str]], click: List[int]) -> List[List[str]]:

        i, j = click

        row, col = len(board), len(board[0])

        if board[i][j] == "M":

            board[i][j] = "X"

            return board

        # 计算空白块周围的雷数目

        def cal(i, j):

            res = 0

            for x in [1, -1, 0]:

                for y in [1, -1, 0]:

                    if x == 0 and y == 0: continue

                    if 0 <= i + x < row and 0 <= j + y < col and board[i + x][j + y] == "M": res += 1

            return res

        def bfs(i, j):

            queue = [(i,j)]

            while queue:

                i, j = queue.pop(0)

                num = cal(i, j)

                if num > 0:

                    board[i][j] = str(num)

                    continue

                board[i][j] = "B"

                for x in [1, -1, 0]:

                    for y in [1, -1, 0]:

                        if x == 0 and y == 0: continue

                        nxt_i, nxt_j = i + x, j + y

                        if nxt_i < 0 or nxt_i >= row or nxt_j < 0 or nxt_j >= col: continue

                        if board[nxt_i][nxt_j] == "E":

                            queue.append((nxt_i, nxt_j))

                            board[nxt_i][nxt_j] = "B"  # 主要是用于标识该点已经被访问过,防止后续重复的添加相同的‘E’点

        bfs(i, j)

        return board

关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

觉得不错的小伙伴,感谢点赞、关注加收藏哦!

欢迎关注下方GZH:阿旭算法与机器学习,共同学习交流~

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

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

相关文章

Opencv中的滤波器

一副图像通过滤波器得到另一张图像&#xff0c;其中滤波器又称为卷积核&#xff0c;滤波的过程称之为卷积。 这就是一个卷积的过程&#xff0c;通过一个卷积核得到另一张图片&#xff0c;明显发现新的到的图片边缘部分更加清晰了&#xff08;锐化&#xff09;。 上图就是一个卷…

攻防世界——Hello, CTF

运行可以发现这是输入型的flag &#xff08;re题目分为两类&#xff0c;一种你直接输入flag&#xff0c;还有一种就是你完成某个操作后&#xff0c;给你flag&#xff09; 可以发现关键字符串就是wrong 和 input 32位 IDA打开 进入直接进入字符串界面&#xff0c;发现关键字符…

Java小案例-讲一下Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理

目录 前言 Nacos 如何进行服务自动注册&#xff1f; 服务自动注册三板斧 服务实例数据封装--Registration 服务注册--ServiceRegistry 服务自动注册--AutoServiceRegistration Ribbon OpenFeign 总结 前言 注册中心要集成SpringCloud&#xff0c;想实现SpringCloud的…

驱动开发-1

一、驱动课程大纲 内核模块字符设备驱动中断 二、ARM裸机代码和驱动有什么区别&#xff1f; 1、共同点&#xff1a; 都能够操作硬件 2、不同点&#xff1a; 1&#xff09;裸机就是用C语言给对应的寄存器里面写值&#xff0c;驱动是按照一定的套路往寄存器里面写值 2&#xff09…

python异常之try/finally分句

1 python异常之try/finally分句 不管try语句代码块是否发生异常&#xff0c;finally分句代码块都会执行。 finally分句用于定义任何情况下都必须执行的清理操作&#xff0c;将会在最后执行。 finally分句用于任何需要保证资源释放的场景。 比如&#xff0c;文件操作后的关闭…

c++11--强枚举类型,智能指针

1.枚举 1.1. c11之前的枚举 实例 #include <iostream>enum Type{ONE,TWO,THREE };int main(){printf("sizeof_%d, ONE_%d\n", sizeof(ONE), ONE);return 0; }具备以下特点&#xff1a; (1). 枚举值直接在父作用域可见。 (2). 枚举底层类型由编译器结合枚举成员…

爬虫工作量由小到大的思维转变---<第二十二章 Scrapy开始很快,越来越慢(诊断篇)>

前言: 相信很多朋友在scrapy跑起来看到速度200/min开心的不得了;可是,越跑到后面,发现速度变成了10-/min;刚开始以为是ip代理的问题,结果根本不得法门... 新手跑3000 ~ 5000左右数据,我相信大多数人没有问题,也不会发现问题; 可一旦数据量上了10W,你是不是就能明显感觉到速度…

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置

Unity PlayerPrefs存储数据在Windows环境中本地存储的位置 一、编辑器模式下的PlayerPrefs存储位置1.Win r 输入regedit进入注册表界面2. HKEY_CURRENT_USER/Software/Unity3.CompanyName和ProjectName可以在Unity->Edit->Project Settings->Player中查看和设置 二、…

华为设备文件系统基础

华为网络设备的配置文件和VRP系统文件都保存在物理存储介质中&#xff0c;所以文件系统是VRP正常运行的基础。只有掌握了对文件系统的基本操作&#xff0c;网络工程师才能对设备的配置文件和VRP系统文件进行高效的管理。 基本查询命令 VRP基于文件系统来管理设备上的文件和目录…

力扣(leetcode)13和14题(Python)

13.罗马数字转整数 题目链接&#xff1a;13.罗马数字转整数 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符数值I1V5X10L50C100D500M1000 例如&#xff0c; 罗马数字 2 写做 II &#xff0c;即为两个并列的…

【低照度图像增强系列(1)】传统方法(直方图、图像变换)算法详解与代码实现

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检…

广行天下车GO项目经验

1.如果有对象返回已有对象,没有创建新对象 QuesionnairResult result this.get(id).map(QuesionnairMapper.INSTANCE::toResult).orElseGet(QuesionnairResult::new);2.类加上 Transactional(readOnly true)只读数据 创建更新删除方法加上 表示异常就回滚 Transactional(roll…

乐才无代码开发:连接CRM提升电商与营销系统

无缝API连接的商业价值 在电子商务生态系统中&#xff0c;无缝的系统连接是保证业务流程顺畅、提高客户满意度的关键。乐才API提供了一种无需编码的集成方法&#xff0c;使得企业能够在不具备深度技术能力的情况下&#xff0c;实现电商平台与各种服务和工具的紧密连接。这种解…

【Spring实战】04 Lombok集成及常用注解

文章目录 0. 集成1. Data2. Getter 和 Setter3. NoArgsConstructor&#xff0c;AllArgsConstructor和RequiredArgsConstructor4. ToString5. EqualsAndHashCode6. NonNull7. Builder总结 Lombok 是一款 Java 开发的工具&#xff0c;它通过注解的方式简化了 Java 代码的编写&…

建立百科词条能带给企业什么营销价值?

也许很多网友都发现了&#xff0c;在网上查资料&#xff0c;百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台&#xff0c;另一方面就是因为百科信息权威&#xff0c;网友认可度高。所以企业开展网络营销&#xff0c;百科营销是一块重要阵地。 也有的企业认为百科…

go从0到1项目实战体系二十:单元测试

initRouter\initRouter.go package initRouter import ("github.com/gin-gonic/gin""net/http" )func SetupRouter() *gin.Engine {router : gin.Default()// 添加 Get 请求路由router.GET("/", func(context *gin.Context) {context.String(ht…

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知&#xff0c;接口ISchedulerListener&#xff0c;如作业的添加、删除、停止、挂起等事件通知&#xff0c;调度器的启动、关闭、出错等事件通知&#xff0c;触发器的暂停、挂起等事件通知&#xff0c;接口部分定义如下&#xff1a…

Linux账号管理与ACL权限设定

目录 账号/etc/passwd/etc/shadow 群组/etc/groupgroups 命令newgrp 命令 /etc/gshadow账号管理useradd 命令login.defs passwd 命令chage 命令usermod 命令userdel 命令 普通用户账号命令SUIDid 命令finger 命令chfn 命令chsh 命令 新增或移除群组groupadd 命令groupmod 命令g…

算数平均数、调和平均数、几何平均数的计算方法与应用场合

一 定义 1、算数平均数&#xff1a;又称均值&#xff0c;是统计学中最基本&#xff0c;最常用的一种平均指标&#xff0c;分为简单算术平均数、加权算术平均数。 2、调和平均数&#xff1a;又称倒数平均数&#xff0c;是总体各统计变量倒数的算数平均数的倒数。分为数学调和平…

[架构之路-265]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 如何做好详细设计

目录 一、详细设计概述 1.1 什么是详细设计 1.2 软件概要设计、软件架构、软件详细设计比较 二、软件详细设计说明书 2.1 概述 2.2 撰写步骤 2.3 主要内容 三、详细设计详解 3.1 引言 3.2 系统架构设计 3.3 模块设计 3.3.1 模块描述 3.3.2 模块间接口设计与UML图 …