代码随想录学习Day 26

332.重新安排行程

题目链接

from collections import defaultdict

class Solution:
    def findItinerary(self, tickets):
        targets = defaultdict(list)  # 创建默认字典,用于存储机场映射关系
        for ticket in tickets:
            targets[ticket[0]].append(ticket[1])  # 将机票输入到字典中
        
        for key in targets:
            targets[key].sort(reverse=True)  # 对到达机场列表进行字母逆序排序
        
        result = []
        self.backtracking("JFK", targets, result)  # 调用回溯函数开始搜索路径
        return result[::-1]  # 返回逆序的行程路径
    
    def backtracking(self, airport, targets, result):
        while targets[airport]:  # 当机场还有可到达的机场时
            next_airport = targets[airport].pop()  # 弹出下一个机场
            self.backtracking(next_airport, targets, result)  # 递归调用回溯函数进行深度优先搜索
        result.append(airport)  # 将当前机场添加到行程路径中

51.N皇后

题目链接

讲解链接

n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。意思就是每个皇后不能处于同行、同列或同斜线上。本题的树形结构如下:

树的每一层递归对应棋盘的一行,深度对应n,宽度为n*n。

回溯三部曲:

1.递归函数参数及返回值:参数为表示棋盘的字符串列表chessboard和遍历到的行数row以及n。

def backtracking(self, chessboard, row, n):

2.递归终止条件:当row == n时,说明已经递归到了棋盘的最后一行,此时应该收集结果并返回。

if row == n:
    self.result.append(chessboard[:])
    return

3.单层递归逻辑:通过row来遍历棋盘的行,col遍历棋盘的列。每次都是从当前行的第1列开始遍历,所以col在每一轮循环中都是从0开始的。再通过isvalid函数判断当前位置放置皇后是否合法。

for col in range(0, n):
    if self.isvalid(chessboard, row, col):
        chessboard[row] = chessboard[row][:col] + 'Q' + chessboard[row][col + 1:]
        self.backtracking(chessboard, row + 1, n)
        chessboard[row] = chessboard[row][:col] + '.' + chessboard[row][col + 1:]

整体代码如下:

class Solution:
    def __init__(self):
        self.result = []  # 储存结果
    def isvalid(self, chessboard, row, col):
        for i in range(row):  # 判断同列是否存在皇后
            if chessboard[i][col] == 'Q':
                return False
        i, j = row - 1, col - 1  # 判断左上角方向是否存在皇后
        while i >= 0 and j >= 0:
            if chessboard[i][j] == 'Q':
                return False
            i -= 1
            j -= 1
        i, j = row - 1, col + 1
        while i >= 0 and j < len(chessboard):  # 判断右上角方向是否存在皇后
            if chessboard[i][j] == 'Q':
                return False
            i -= 1
            j += 1
        return True
    def backtracking(self, chessboard, row, n):
        if row == n:  # 终止条件
            self.result.append(chessboard[:])  # 收集结果
            return
        for col in range(0, n):  # 每一行都从第0列开始遍历
            if self.isvalid(chessboard, row, col):  # 判断是否合法
                chessboard[row] = chessboard[row][:col] + 'Q' + chessboard[row][col + 1:]  # 由于不能直接进行赋值,需要通过切片的方式来将row行col列位置的元素赋值为‘Q’
                self.backtracking(chessboard, row + 1, n)
                chessboard[row] = chessboard[row][:col] + '.' + chessboard[row][col + 1:]  # 回溯过程,将该位置变回‘.’
    def solveNQueens(self, n: int) -> List[List[str]]:
        chessboard = ['.' * n for _ in range(n)]  # 初始化棋盘
        self.backtracking(chessboard, 0, n)
        return self.result

37.解数独

题目链接

讲解链接

N皇后是因为每一行每一列只放一个皇后,只需要一层for循环遍历一行,递归来遍历列,然后一行一列确定皇后的唯一位置。本题就不一样了,本题中棋盘的每一个位置都要放一个数字(而N皇后是一行只放一个皇后),并检查数字是否合法,解数独的树形结构要比N皇后更宽更深

回溯三部曲:

1.递归函数参数及返回值:递归函数的返回值需要是bool类型,因为解数独找到一个符合的条件(就在树的叶子节点上)立刻就返回,相当于找从根节点到叶子节点一条唯一路径,所以需要使用bool返回值。

def backtracking(self, board):

2.递归终止条件:解数独是要遍历整个树形结构寻找可能的叶子节点就立刻返回。递归的下一层的棋盘一定比上一层的棋盘多一个数,等数填满了棋盘自然就终止(填满说明找到了结果),所以不需要终止条件。

3.单层搜索逻辑:在树形图中可以看出我们需要的是一个二维的递归 (一行一列)一个for循环遍历棋盘的行,一个for循环遍历棋盘的列,一行一列确定下来之后,递归遍历这个位置放9个数字的可能性!

for row in range(len(board)):
    for col in range(len(board[0])):
        if board[row][col] != '.': 
            continue
        for k in range(1, 10):
            if self.isvalid(row, col, k, board):
            board[row][col] = str(k)
            if self.backtracking(board):
                return True
            board[row][col] = '.'
        return False
return True

整体代码如下:

class Solution:
    def isvalid(self, row, col, k, board):  # 判断当前格内数字是否合法
        for i in range(9):  # 查找同行中是否存在相同数字
            if board[row][i] == str(k):
                return False
        for i in range(9):  # 查找同列中是否存在相同数字
            if board[i][col] == str(k):
                return False
        row_k = (row // 3) * 3  # 当前位置所处九宫格的起始行
        col_k = (col // 3) * 3  # 当前位置所处九宫格的起始列
        for i in range(row_k, row_k + 3):  # 判断九宫格中是否存在相同数字
            for j in range(col_k, col_k + 3):
                if board[i][j] == str(k):
                    return False
        return True
    def backtracking(self, board):  # 返回值为bool类型,若找到合法结果就直接返回True
        for row in range(len(board)):  # 第一个for循环遍历行
            for col in range(len(board[0])):  # 第二个for循环遍历列
                if board[row][col] != '.':   # 如果当前位置不为空则直接跳过
                    continue
                for k in range(1, 10):  # 从1到10依次填入数字
                    if self.isvalid(row, col, k, board):  # 判断当前填入的k值是否合法
                        board[row][col] = str(k)  # 将k转为字符形式填入
                        if self.backtracking(board):  # 递归向下一个空格内填入数字
                            return True  # 若返回均为True则说明找到了一组结果
                        board[row][col] = '.'  # 回溯,将之前填上的不符合条件的数字恢复为‘.’
                return False  # 若填入1到10都不符合则说明无解
        return True  # 遍历结束则说明填满了棋盘,找到了一组解
    def solveSudoku(self, board: List[List[str]]) -> None:
        self.backtracking(board)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GlusterFS分布式存储

目录 前言 一、GlusterFS分布式存储概述 1、GFS概念 2、GFS特点 3、GFS术语 4、GFS构成 5、GFS工作流程 6、后端存储如何定位文件 7、GlusterFs的卷类型 7.1 Distributed Volume&#xff08;分布式卷&#xff09; 7.2 Striped Volume&#xff08;条带卷&#xff09…

【JavaEE初阶系列】——网络初识—TCP/IP五层网络模型

目录 &#x1f6a9;网络的发展史 &#x1f388;局域网LAN &#x1f388;广域网WAN &#x1f6a9;网络通信基础 &#x1f388;IP地址 &#x1f388;端口号 &#x1f388;协议类型 &#x1f388;五元组 &#x1f6a9;协议分层 &#x1f388;什么是协议分层 &#x…

Web前端-Ajax

Ajax 概念:Asynchronous JavaScript And XML,异步的JavaScript和XML。 作用: 1.数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。 2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等…

TryHackMe - HTTP Request Smuggling

学完、打完后的复习 HTTP 1 这部分比较简单&#xff0c;直接略过 HTTP2请求走私 首先要了解HTTP2的结构&#xff0c;与HTTP1之间的一些差异 HTTP2中不再使用CRLF来作为字段的边界限定&#xff0c;而是在二进制中直接通过长度、名字、值长度、值&#xff0c;来确认边界 而这…

Leetcode算法训练日记 | day21

一、二叉搜索树的最小绝对差 1.题目 Leetcode&#xff1a;第 530 题 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,…

不到6毛钱的I2C总线实时时钟日历芯片LK8563

前言 8563实时时钟芯片&#xff0c;国内外均有多家生产&#xff0c;今推荐一个性价比极高的RTC芯片&#xff0c;LK8563&#xff0c;一片不到6毛钱. 特点 基于32.768kHz晶体的秒&#xff0c;分&#xff0c;小时&#xff0c;星期&#xff0c;天&#xff0c;月和年的计时 带有世…

Redis系列之基于Linux单机安装

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库&#xff0c;并提供多种语言的 API。最近学习需要用到Redis&#xff0c;所以就去Linux服务器上部署一个&#xff0c;做下记录&#xff0c;方便…

web安全学习笔记【22】——文件上传(1)

WEB攻防-PHP应用&文件上传&函数缺陷&条件竞争&二次渲染&黑白名单&JS绕过 演示案例&#xff1a; PHP-原生态-文件上传-前后端验证PHP-原生态-文件上传-类型文件头验证PHP-原生态-文件上传-后缀黑白名单验证PHP-原生态-文件上传-解析配置&二次渲染…

JUC 线程及创建线程

最近想再系统地复习一遍并发&#xff0c;随便再把以前整理的笔记整理为博客。 概念 了解线程前先要了解一下进程&#xff0c;进程是程序的一次执行过程&#xff0c;是系统运行的基本单位&#xff0c;其可以拥有资源&#xff0c;一个进程在执行期间会执行一系列的命令。 什么…

华为OD机试真题-模拟数据序列化传输 -2024年OD统一考试(C卷)

题目描述: 模拟一套简化的 序列化只 传输方式,请实现下面的数据编码与解码过程 1、编码前数据格式为 [位置,类型,值],多个数据的时候用逗号分隔,位置仅支持数字,不考虑重复等场景;类型仅支持:Integer/String/Compose(Compose的数据类型表示该存储的数据也需要编码) 2.编码…

【攻防世界】Confusion1

php的标志是大象&#xff0c;Python的标志是蛇 。Python 的 Flask 框架( Flask 使用 Jinja2 作为模板引擎 ) 点进register.php 输入{{3*4}} 输入 {{config}} 也有回显&#xff0c;ssti 判断是否存在ssti注入&#xff1a; 1. {{8*8}} 2. {{config}} 过滤了关键字&#xff0…

二、显示图片、提取边缘特征并保存(C# + OpenCV)

实现功能&#xff1a; 1&#xff0c;打开照片&#xff0c;并显示 2&#xff0c;对选择的照片进行Canny边缘检测 3&#xff0c;保存边缘检测之后的结果 一、布局 打开在视图下打开工具箱 选择一个PictureBox&#xff0c;仨Button 对Button改个名字 仨Button&#xff0c;分别…

Python从0到100(十二):函数的定义及模块

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

AI大模型探索之路-应用篇2:Langchain框架ModelIO模块—数据交互的秘密武器

目录 前言 一、概述​​​​​​​ 二、Model 三、Prompt 五、Output Parsers 总结 前言 随着人工智能技术的不断进步&#xff0c;大模型的应用场景越来越广泛。LangChain框架作为一个创新的解决方案&#xff0c;专为处理大型语言模型的输入输出而设计。其中&#xff0c;…

设计模式(22):解释器模式

解释器 是一种不常用的设计模式用于描述如何构成一个简单的语言解释器&#xff0c;主要用于使用面向对象语言开发的解释器和解释器设计当我们需要开发一种新的语言时&#xff0c;可以考虑使用解释器模式尽量不要使用解释器模式&#xff0c;后期维护会有很大麻烦。在项目中&…

【Redis】持久化

文章目录 一、RDB1.1、RDB的自动备份与手动备份1.1.1、自动备份1.1.2、手动备份 1.2、RDB优点1.3、RDB缺点1.4、RDB快照1.5、RDB优化配置项 二、AOF2.1、AOF工作流程2.2、AOF写回策略2.3、MP-AOF实现2.4、AOF优缺点2.5、AOF重写机制 三、RDBAOF混合持久化3.1、数据恢复顺序和加…

阿里云OSS使用流程

准备工作 无论怎么样&#xff0c;你需要准备一个阿里云账号&#xff0c;点击&#xff1a;注册阿里云 输入相关信息&#xff0c;然后注册成功以后&#xff0c;点击 然后注册成功了&#xff0c;实名一下阿里云账号。打开实名入口&#xff0c;选择个人实名或者企业实名。 如果你…

windows wireshark抓包rtmp推流出现TCP Retransmission

解决办法&#xff1a;tcp.port1935 && !(tcp.analysis.retransmission)

签名失败当前系统没有安装苹果根证书

发生背景 第一次我没有iOS证书(.p12)和描述文件(.mobileprovision)。按照这个文档https://ask.dcloud.net.cn/article/152拿到后&#xff0c;安心打包出问题。 错误信息 [Info] begin getCertCName... [Info] begin codesignFramwork to ipa... [Error] DCUniBase.framework…

设计模式系列:单例模式

作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;WPS二次开发QQ群:250325397&#xff09;&#xff0c;摸鱼吹牛嗨起来&#xff01…