代码随想录学习Day 26

332.重新安排行程

题目链接

from collections import defaultdictclass 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 Falsei, j = row - 1, col - 1  # 判断左上角方向是否存在皇后while i >= 0 and j >= 0:if chessboard[i][j] == 'Q':return Falsei -= 1j -= 1i, j = row - 1, col + 1while i >= 0 and j < len(chessboard):  # 判断右上角方向是否存在皇后if chessboard[i][j] == 'Q':return Falsei -= 1j += 1return Truedef backtracking(self, chessboard, row, n):if row == n:  # 终止条件self.result.append(chessboard[:])  # 收集结果returnfor 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] != '.': continuefor k in range(1, 10):if self.isvalid(row, col, k, board):board[row][col] = str(k)if self.backtracking(board):return Trueboard[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 Falsefor i in range(9):  # 查找同列中是否存在相同数字if board[i][col] == str(k):return Falserow_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 Falsereturn Truedef backtracking(self, board):  # 返回值为bool类型,若找到合法结果就直接返回Truefor row in range(len(board)):  # 第一个for循环遍历行for col in range(len(board[0])):  # 第二个for循环遍历列if board[row][col] != '.':   # 如果当前位置不为空则直接跳过continuefor 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)

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

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

相关文章

win11网络驱动怎么安装,windows11怎么安装驱动

win11网络驱动怎么安装呢?驱动程序是系统中非常重要的部分,当安装新硬件时,相应的硬件没有驱动程序,那么在计算中就无法工作。而有了驱动后,计算机就可以与设备进行通信。例如,电脑如果缺少了网络驱动,那么就会无法上网,需要安装上网的驱动程序。由于win11系统变化太大…

Echarts柱状图多样式实现

样式一 样式二 在这里插入代码片

数据库索引详解

目录 第一章、快速了解索引1.1&#xff09;索引是什么1.2&#xff09;为什么使用索引1.3&#xff09;操作索引示例 第二章、索引分类2.1&#xff09;按数据结构分类2.1.1&#xff09;树型数据结构索引二叉树B树B 树 2.1.2&#xff09;Hash数据结构索引2.1.3&#xff09; 其他数…

【JavaWeb】Day34.MySQL概述——数据库设计-DDL(一)

项目开发流程 需求文档&#xff1a; 在我们开发一个项目或者项目当中的某个模块之前&#xff0c;会先会拿到产品经理给我们提供的页面原型及需求文档。 设计&#xff1a; 拿到产品原型和需求文档之后&#xff0c;我们首先要做的不是编码&#xff0c;而是要先进行项目的设计&am…

docker搭建EFK

目录 elasticsearch1.创建网络2.拉取镜像3.创建容器如果出现启动失败&#xff0c;提示目录挂载失败&#xff0c;可以考虑如下措施 开放防火墙端口4.验证安装成功重置es密码关闭https连接创建kibana用户创建新账户给账户授权 kibana1.创建容器2.验证安装成功3.es为kibana创建用户…

java对象是怎么在jvm中new出来的,在内存中查看java对象成员变量字段属性值

java对象是怎么在jvm中new出来的 查看java对象字段属性在内存中的值 java 对象 创建 流程 附上java源码 public class MiDept {private int innerFiled999;public MiDept() {System.out.println("new MiDept--------------");}public String show(int data) {Sy…

电脑怎么才能用动态ip上网?步骤详解与优势分析

在数字化时代&#xff0c;互联网已成为我们生活与工作中不可或缺的一部分。为了保障网络安全、提升网络效率或满足特定应用场景的需求&#xff0c;有时我们需要为电脑配置动态IP地址上网。那么&#xff0c;如何为电脑设置动态IP地址呢&#xff1f;本文将为您详细介绍动态IP的配…

为什么AI模型需要合乎道德的数据

道德问题简介 “合乎道德的数据”和“负责任的数据”这两个词的含义可能并不明确。在科技界和AI数据界&#xff0c;道德原则是指负责任地采集和使用数据用以训练模型&#xff0c;并确保这些模型不带偏见地与人类交互。不仅为训练模型负责任地采集和使用数据很重要&#xff0c;…

Java的jmap命令使用详解

jmap命令简介 jmap&#xff08;Java Virtual Machine Memory Map&#xff09;是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具。 以外&#xff0c;jmap命令还可以查看finalize执行队列、Java堆和方法区的详细信息&#xff0c;比如空间使用率、当前使用的…

Elastic:5 个原因解释为什么可观察性和安全性能够很好地协同工作

作者&#xff1a;来自 Elastic Jennifer Ellard, Gagan Singh 网站可靠性工程师&#xff08;site reliability engineers - SREs&#xff09;和安全分析师 (security analysts) —— 尽管担任着非常不同的角色 —— 分享了许多相同的目标。他们都采用主动监控和事件响应策略来识…

【随笔】Git 高级篇 -- 撤销变更 reset | revert(十四)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

Cuda编程-NPP库

Cuda编程先前有过研究&#xff0c;现在记录下Cuda相关的库使用 目录 0.参考文档1.NPP简介1.1 头文件1.2 库文件1.3 编译时链接关系1.4 NPP函数的命名方式1.5 General Conventions 一般约定1.6 Image Processing Conventions 图像处理约定 2.举例&#xff1a;NPP实现YUV转BGR2.1…

基于Android的记单词App系统的设计与实现

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

【服务器部署篇】Linux下安装Docker容器

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

SqlServer占用CPU过高情况排查

一、问题描述 反馈SQLServer中出现CPU使用率过高有许多可能原因&#xff0c;但常见的原因如下最为常见&#xff1a; 由于以下情况&#xff0c;表或索引扫描导致的高逻辑读取&#xff1a; 过期统计信息缺少索引设计不佳的查询工作负载增加 针对此类问题&#xff0c;微软有一套…

数据恢复软件能不能恢复已经删除的监控视频

随着安防意识的日益增强&#xff0c;监控视频已成为众多场所不可或缺的安全保障。然而&#xff0c;由于各种原因&#xff0c;我们可能会不小心删除了一些重要的监控视频。面对这种情况&#xff0c;许多人都会想到使用数据恢复软件来尝试找回这些丢失的视频。那么&#xff0c;数…

堆放砖块-第12届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第47讲。 堆放砖块&#xf…

Redis 常用的基本命令

&#x1f525;博客主页&#xff1a;fly in the sky - CSDN博客 &#x1f680;欢迎各位&#xff1a;点赞&#x1f44d;收藏⭐️留言✍️&#x1f680; &#x1f386;慢品人间烟火色,闲观万事岁月长&#x1f386; &#x1f4d6;希望我写的博客对你有所帮助,如有不足,请指正&#…

群联AI云防护中的防盗链技术原理及其作用探析---

一、引言 随着云计算和AI技术的快速发展&#xff0c;云防护方案已经成为现代企业防范网络攻击和保护数字资产的重要手段之一。群联科技作为存储解决方案和技术服务的领导者&#xff0c;已将其AI技术应用于云端防护系统中&#xff0c;并特别强化了防盗链功能&#xff0c;以帮助…

MQTT协议特点及数据包结构详解(值得珍藏)

点击下载《MQTT协议特点及数据包结构详解(值得珍藏)》 1. 前言 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。 MQTT最大优点在…