算法D30 | 回溯算法6 | 332.重新安排行程 51. N皇后 37. 解数独

详细布置

今天这三道题都非常难,那么这么难的题,为啥一天做三道? 

因为 一刷 也不求大家能把这么难的问题解决,所以 大家一刷的时候,就了解一下题目的要求,了解一下解题思路,不求能直接写出代码,先大概熟悉一下这些题,二刷的时候,随着对回溯算法的深入理解,再去解决如下三题。 

大家今天的任务,其实是 对回溯算法章节做一个总结就行。 

重点是看 回溯算法总结篇:

代码随想录

332.重新安排行程(可跳过) 

代码随想录

Python使用used数组,lc1/81会超时:

class Solution:def __init__(self):self.result = []self.path = ["JFK"]def backtracking(self, tickets, cur,  used):if len(self.path)==len(tickets)+1:self.result = self.path[:]return Truefor i, ticket in enumerate(tickets):if ticket[0] == cur and used[i] == False:used[i] = True    self.path.append(ticket[1])state = self.backtracking(tickets, ticket[1], used)if state: return Trueused[i] = Falseself.path.pop()  def findItinerary(self, tickets: List[List[str]]) -> List[str]:tickets.sort()used = [False] * len(tickets)self.backtracking(tickets, 'JFK', used)return self.result

python版本只有优化到 使用字典 并逆序查找才可以通过所有的测试用例。

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)  # 将当前机场添加到行程路径中

C++:

class Solution {
private:
unordered_map<string, map<string, int>> targets;
bool backtracking(int ticketNum, vector<string>& result) {if (result.size()==ticketNum+1) return true;for (pair<const string, int>& target: targets[result[result.size()-1]]) {if (target.second > 0) {result.push_back(target.first);target.second--;if (backtracking(ticketNum, result)) return true;result.pop_back();target.second++;}}return false;
}    public:   vector<string> findItinerary(vector<vector<string>>& tickets) {vector<string> result;result.push_back("JFK");for (const vector<string>& vec: tickets) {targets[vec[0]][vec[1]]++;}backtracking(tickets.size(), result);return result;}
};

51. N皇后(可跳过) 

代码随想录

视频讲解:这就是传说中的N皇后? 回溯算法安排!| LeetCode:51.N皇后_哔哩哔哩_bilibili

Python:

class Solution:def __init__(self):self.result = []def isValid(self, row, col, chessboard):# 检查列for i in range(row):if chessboard[i][col] == 'Q':return False# 检查45度i, j = row-1, col-1while i>=0 and j>=0:if chessboard[i][j] == 'Q':return Falsei -= 1j-= 1# 检查135度i, j = row-1, col+1while i>=0 and j<len(chessboard):if chessboard[i][j] == 'Q':return Falsei -= 1j += 1return Truedef backtracking(self, n, row, chessboard):if row==n:self.result.append(chessboard[:])returnfor col in range(n):if self.isValid(row, col, chessboard):chessboard[row] = chessboard[row][:col] + 'Q' + chessboard[row][col+1:]self.backtracking(n, row+1, chessboard)chessboard[row] = chessboard[row][:col] + '.' + chessboard[row][col+1:]               returndef solveNQueens(self, n: int) -> List[List[str]]:if n==1: return [['Q']]    chessboard = ['.'*n for _ in range(n)]self.backtracking(n, 0, chessboard)return self.result

C++:

class Solution {
public:vector<vector<string>> result;void backtracking(int n, int row, vector<string>& chessboard) {if (row==n) {result.push_back(chessboard);return;}for (int col=0; col<n; col++) {if (isValid(row, col, chessboard)) {chessboard[row][col] = 'Q';backtracking(n, row+1, chessboard);chessboard[row][col] = '.';}}}bool isValid(int row, int col, vector<string>& chessboard) {// 检查列for (int i=0; i<row; i++) {if (chessboard[i][col]=='Q') return false;}// 检查45度for (int i=row-1, j = col-1; i>=0 && j>=0; i--, j--) {if (chessboard[i][j]=='Q') return false;}// 检查135度for (int i=row-1, j=col+1; i>=0 && j<chessboard.size(); i--, j++) {if (chessboard[i][j]=='Q') return false;}return true;}vector<vector<string>> solveNQueens(int n) {result.clear();std:: vector<std::string> chessboard(n, std::string(n, '.'));backtracking(n, 0, chessboard);return result;}
};

37. 解数独(可跳过) 

代码随想录

视频讲解:回溯算法二维递归?解数独不过如此!| LeetCode:37. 解数独_哔哩哔哩_bilibili

Python:

class Solution:def isValid(self, row, col, ele, board):# 行for i in range(9):if board[row][i] == ele: return False# 列for j in range(9):if board[j][col] == ele: return False# 九宫格start_row = (row//3) * 3start_col = (col//3) * 3for i in range(start_row, start_row+3):for j in range(start_col, start_col+3):if board[i][j] == ele: return Falsereturn Truedef backtracking(self, row, board):for row in range(9):for col in range(9):if board[row][col] != ".": continuefor ele in range(1, 10):if self.isValid(row, col, str(ele), board): board[row][col] = str(ele)if self.backtracking(row+1, board): return Trueboard[row][col] = '.'return Falsereturn Truedef solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""self.backtracking(0, board)

C++:

class Solution {
public:bool isValid(int row, int col, char ele, vector<vector<char>>& board) {// 行for (int i=0; i<9; i++) {if (board[row][i]==ele) return false;}// 列for (int j=0; j<9; j++) {if (board[j][col]==ele) return false;}        // 九宫格int startRow = (row/3) * 3;int startCol = (col/3) * 3;for (int i=startRow; i<startRow+3; i++) {for (int j=startCol; j<startCol+3; j++) {if (board[i][j]==ele) return false;}}return true;}bool backtracking(vector<vector<char>>& board) {for (int row=0; row<9; row++) {for (int col=0; col<9; col++) {if (board[row][col]=='.') {for (char ele='1'; ele<='9'; ele++) {if (isValid(row, col, ele, board)) {board[row][col] = ele;if (backtracking(board)) return true;board[row][col] = '.';}                        }return false;}}}return true;}void solveSudoku(vector<vector<char>>& board) {backtracking(board);}
};

总结

代码随想录

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

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

相关文章

数据结构之顺序表及其实现!

目录 ​编辑 1. 顺序表的概念及结构 2. 接口的实现 2.1 顺序表的初始化 2.2 检查顺序表容量是否已满 2.3 顺序表的尾插 ​编辑 2.4 顺序表的尾删 2.5 顺序表的头插 2.6 顺序表的头删 2.7 顺序表在pos位置插入 2.8 顺序表在pos位置删除 2.9 顺序表的查找 2.10 顺…

探秘RestTemplate:解析远程调用的神奇力量(二)

本系列文章简介&#xff1a; 本系列文章将深入探讨RestTemplate的原理及其应用。我们将从RestTemplate的工作原理开始&#xff0c;解析其内部机制和工作流程。然后&#xff0c;我们将介绍RestTemplate的核心功能和特点&#xff0c;以及它在不同场景下的应用。我们还将为您提供一…

数据分析Pandas专栏---第十三章<Pandas训练题(初)>

前言: 写这篇是为了弄一个富有挑战性的Pandas练习题库&#xff0c;涵盖了许多常见和实用的数据处理问题。通过解决这些练习&#xff0c;能够深入了解Pandas提供的关键功能&#xff0c;掌握有效处理数据的技巧和方法。 练习题库涵盖了选择特定列并创建新DataFrame、对DataFrame进…

考研数学——高数:多元函数微分法及其应用

因为复习阶段全篇很细节的写下来一来比较费时间&#xff0c;二容易导致为了记笔记而记。 接下来的内容只会保留上课中比较有意义的地方&#xff0c;以及有自己助于理解的想法 全微分 助记&#xff1a; 证明是否可微&#xff0c;首先判断两个偏导数是否存在&#xff0c;不存在则…

中文版国产Figma简单好上手

在过去的两年里&#xff0c;国内外协同办公室发展迅速。一方面&#xff0c;它是由突如其来的疫情推动的&#xff0c;另一方面&#xff0c;它是科学技术不断进步的必然结果。在市场的推动下&#xff0c;市场上出现了越来越多的协同办公软件&#xff0c;使工作场所的工作更加高效…

插入排序和归并排序

插入排序&#xff0c;Insertion Sort. 给出伪代码 for i 1,2,...,n-1Insert A[i] into Sorted array A[0:i-1]by swaping down to the correct position. 冒泡排序 冒泡排序就是一种插入排序算法。 i ← 1 while i < length(A)j ← iwhile j > 0 and A[j-1] > A…

POST和GET传值的方法

区别&#xff1a; 1. Get是从服务器上获取数据&#xff0c;Post是向服务器传送数据。 2. Get是把参数数据队列加到提交表单的action属性所指的url中 值和表单内各个字段一一对应&#xff0c;在url中可以看到。Post是通过http中的 Post机制&#xff0c;将表单内各个字段与其内…

CorelDRAW2024专业级图形设计矢量图形设计软件

CorelDRAW2024是一款功能强大的矢量图形设计软件&#xff0c;适用于专业级图形设计作品的设计师和创作者。它提供了智能对象、布局、插图和模板等功能&#xff0c;可以帮助用户快速创建高质量的设计作品。 这款软件的用户界面直观且易于使用&#xff0c;允许用户快速访问和管理…

[渗透教程]-024-Hashcat密码破解

Hashcat 简介 Hashcat 自称是世界上最快的密码恢复工具。它在2015年之前拥有专有代码库,但现在作为免费软件发布。适用于 Linux,OS X 和 Windows 的版本可以使用基于 CPU 或基于 GPU 的变体。支持 hashcat 的散列算法有 Microsoft LM hash,MD4,MD5,SHA 系列,Unix 加密格…

Cannot resolve plugin org.springframework.boot:spring-boot-maven-plugin:x.x.x报错

Cannot resolve plugin org.springframework.boot:spring-boot-maven-plugin:x.x.x报错 环境 springboot 2.6.3 IDEA 2021.2.3 解决办法 清除IDEA缓存并重启给spring-boot-maven-plugin指定版本号后重新索引再删除版本号

184基于matlab的相关向量机(RVM)回归和分类算法

基于matlab的相关向量机&#xff08;RVM&#xff09;回归和分类算法。该算法基于贝叶斯稀疏核⽅法&#xff0c;避免了支持向量机&#xff08;SVM&#xff09;的主要局限性。RVM关键是为每个权参数 都引入一个单独的超参数 &#xff0c;而不是一个共享超参数。程序已调通&#x…

力扣hot100:42.接雨水(双指针/动态规划/贪心)

什么时候能用双指针&#xff1f; &#xff08;1&#xff09;对撞指针&#xff1a; ①两数和问题中可以使用双指针&#xff0c;先将两数和升序排序&#xff0c;可以发现规律&#xff0c;如果当前两数和大于target&#xff0c;则右指针向左走。 ②接雨水问题中&#xff0c;左边最…

【Web】浅聊JDBC的SPI机制是怎么实现的——DriverManager

目录 前言 分析 前言 【Web】浅浅地聊JDBC java.sql.Driver的SPI后门-CSDN博客 上篇文章我们做到了知其然&#xff0c;知道了JDBC有SPI机制&#xff0c;并且可以利用其Driver后门 这篇文章希望可以做到知其所以然&#xff0c;对JDBC的SPI机制的来源做到心里有数 分析 先是…

Python 弱引用全解析:深入探讨对象引用机制!

目录 前言 弱引用的概述 弱引用的原理 使用 WeakRef 类创建弱引用 使用 WeakValueDictionary 类创建弱引用字典 实际应用场景 1. 解决循环引用问题 2. 对象缓存 总结 前言 在Python编程中&#xff0c;弱引用&#xff08;Weak Reference&#xff09;是一种特殊的引用方式…

(文末送书)《低代码平台开发实践:基于React》

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&am…

古人如何求开方

古代开方&#xff0c;即古代数学中的解方程问题&#xff0c;主要涉及的是一元二次方程的求解。古代中国、希腊、印度等文明都对此有所研究。 在中国&#xff0c;古代数学家对开方的研究可以追溯到《九章算术》这本书。《九章算术》是中国古代一部重要的数学著作&#xff0c;大约…

CPU尖峰导致电脑卡顿问题记录

困扰了近一个月的问题终于解决了。 问题描述 最近电脑出现CPU尖峰&#xff0c;不知道怎么回事。每隔约10秒CPU就会出现尖峰&#xff0c;出现尖峰的时候&#xff0c;看视频时视频会出现明显卡顿&#xff0c;看网页UI时网页也会卡顿&#xff0c;上下翻滚页面时页面会出现卡顿&a…

PCM会重塑汽车OTA格局吗(2)

目录 1.概述 2. PCM技术视角下的OTA 3.小结 1.概述 上一篇文章&#xff0c;我们着重讲解了OTA的概述内容&#xff0c;和意法半导体推出的跨域融合MCU的四大特征&#xff0c;其中就包含了OTA技术。 他们针对OTA做了比较创新的设计&#xff0c;在总的可用memory容量不变情况…

2024最新Android开发面试解答,学海无涯

一个程序员&#xff0c;如果不想35 岁被淘汰&#xff0c;请把它当成一种信仰&#xff01; 25岁&#xff0c;一个北漂程序员&#xff0c;入职三年&#xff0c;Android中级工程师&#xff0c;月薪15k&#xff0c;965的工作经常干成996&#xff0c;比起老家的同龄人&#xff0c;我…

15-Linux部署HBase集群

Linux部署HBase集群 简介 HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库。 和Redis一样&#xff0c;HBase是一款KeyValue型存储的数据库。 不过和Redis设计方向不同 Redis设计为少量数据&#xff0c;超快检索HBase设计为海量数据&#xff0c;快速检索 HB…