算法学习——LeetCode力扣回溯篇4
算法学习——LeetCode力扣回溯篇4
332. 重新安排行程
332. 重新安排行程 - 力扣(LeetCode)
描述
给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。
所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。
例如,行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。
示例
示例 1:
输入:tickets = [[“MUC”,“LHR”],[“JFK”,“MUC”],[“SFO”,“SJC”],[“LHR”,“SFO”]]
输出:[“JFK”,“MUC”,“LHR”,“SFO”,“SJC”]
示例 2:
输入:tickets = [[“JFK”,“SFO”],[“JFK”,“ATL”],[“SFO”,“ATL”],[“ATL”,“JFK”],[“ATL”,“SFO”]]
输出:[“JFK”,“ATL”,“JFK”,“SFO”,“ATL”,“SFO”]
解释:另一种有效的行程是 [“JFK”,“SFO”,“ATL”,“JFK”,“ATL”,“SFO”] ,但是它字典排序更大更靠后。
提示
- 1 <= tickets.length <= 300
- tickets[i].length == 2
- fromi.length == 3
- toi.length == 3
- fromi 和 toi 由大写英文字母组成
- fromi != toi
代码解析
回溯遍历(超时)
回溯遍历每一种可能
当出现第一种可能的路线,之间加入。
当出现新的可能路线,与老路线对比,如果字典排序小于,则替换老路线
class Solution {
public:vector<string> resul;vector<string> path;void backtraking(vector<vector<string>>& tickets , string Indnx , vector<bool> &used){//找到路线,看是否替换老的路径//如果没有老路径直接加入,如果相同就返回,如果不同路径按照字典比较if(path.size()==tickets.size()+1){if(resul.empty()==1) {resul = path;return;}else if(resul == path) return;else {for(int j=0 ;j<path.size();j++){for(int k=0 ;k<3;k++){if(resul[j][k] == path[j][k]) continue;else if(resul[j][k] < path[j][k])return;else if(resul[j][k] > path[j][k]) {resul.clear();resul = path;return;}}}}// cout<<"resu: ";// for(auto i:resul) cout<<i<<' ';// cout<<endl;return;}for(int i=0 ; i<tickets.size();i++){//如果当前机票使用过,或者当前机票目的地不对,跳过if(used[i]==true || tickets[i][0] != Indnx) continue;//如果当前机票可用,则加入路径if(used[i]== false && tickets[i][0] == Indnx){used[i] = true;path.push_back(tickets[i][1]);//递归,确定递归找的新机票。下一站机票的开始机场,就是当前机票的目的地机场backtraking(tickets,tickets[i][1],used);used[i] = false;path.pop_back();}}return;}vector<string> findItinerary(vector<vector<string>>& tickets) {vector<bool> used(tickets.size(),false);path.push_back("JFK");backtraking(tickets,"JFK",used);return resul;}
};
排序再回溯
先对输入票排序,其中排序按照票的目的地的字典减少排序(因为出发点是确定的,目的地多种找最优解)
之后回溯遍历找路线,发现的第一个路线即为最优路线
class Solution {
public://按飞机票目的地(字符串vector第二个参数)字典减小排序class compare{public:bool operator()( const vector<string> tickets1 ,const vector<string> tickets2 ){if((tickets1[1])[0] < (tickets2[1])[0]) return 1;else if((tickets1[1])[0] == (tickets2[1])[0]){if((tickets1[1])[1] < (tickets2[1])[1]) return 1;else if((tickets1[1])[1] == (tickets2[1])[1]){if((tickets1[1])[2] < (tickets2[1])[2]) return 1;else return 0;}return 0;}return 0;}};vector<string> resul;vector<string> path;bool find = false;void backtraking(vector<vector<string>>& tickets , string Indnx , vector<bool> &used){//找到一个路径就不找了,直接是最优路径if(find == true ) return;if(path.size()==tickets.size()+1){resul = path;find =true;return;}for(int i=0 ; i<tickets.size();i++){if(used[i]==true || tickets[i][0] != Indnx) continue;if(used[i]== false && tickets[i][0] == Indnx){used[i] = true;path.push_back(tickets[i][1]);backtraking(tickets,tickets[i][1],used);used[i] = false;path.pop_back();}}return;}vector<string> findItinerary(vector<vector<string>>& tickets) {vector<bool> used(tickets.size(),false);sort(tickets.begin(),tickets.end(),compare());// for(auto i:tickets) // {// cout<<'[';// for(auto j:i)// {// cout<<j<<' ';// }// cout<<']';// }path.push_back("JFK");backtraking(tickets,"JFK",used);return resul;}
};
51. N 皇后
51. N 皇后 - 力扣(LeetCode)
描述
按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例
示例 1:
输入:n = 4
输出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解释:如上图所示,4 皇后问题存在两个不同的解法。
示例 2:
输入:n = 1
输出:[[“Q”]]
提示
1 <= n <= 9
代码解析
递归遍历
主要是去除同行和同列
class Solution {
public:vector<vector<string>> result;vector<int>path;//求绝对值int abs(int a){if (a < 0) return -a;else return a;}void backtraking(int n ,vector<bool> &used ,int deep){ //当深度大于n时返回if(deep > n) return;//当路径为最大深度,找到路径存入if(path.size() == n){//将数字路径转换成字符串路径vector<string> path_s;for(int i=0;i<n;i++){string tmp ;for(int k=0;k<n;k++) tmp +='.';//建立n个.for(int j=0;j<n;j++) if(j==path[i]) tmp[j] = 'Q';//在应该放Q的位置放Qpath_s.push_back(tmp);//转换好的字符串存入路径}//存入结果result.push_back(path_s);return;}//层次循环,找到每一行的点。for(int i=0 ; i<n; i++){if(used[i] == true) continue; //该点用过了,跳过。一个树枝的点只能用一次pair<int,int> x(deep,i);//当前可能有效点bool flag = true;//当前点,和path路径里面所有点依次对比for(int j =0 ; j < path.size() ;j++){pair<int,int> y(j,path[j]);//path之前加入的点//检测当前点与之前路径点,是否在一列一行和对角线if( abs(x.first - y.first)==0 || abs(x.second - y.second)==0 || abs(x.first - y.first) == abs(x.second - y.second) ) flag = false;}//检测是合格点,加入pathif(flag == true){//记录该点使用used[i] = true;path.push_back(i);//递归,深度+1(找下一行)backtraking(n,used,deep+1);path.pop_back();used[i] = false;}}return;}vector<vector<string>> solveNQueens(int n) { vector<bool> used(n,false);backtraking(n ,used,0);return result;}
};
37. 解数独
37. 解数独 - 力扣(LeetCode)
描述
编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。
示例
示例 1:
输入:board = [[“5”,“3”,“.”,“.”,“7”,“.”,“.”,“.”,“.”],[“6”,“.”,“.”,“1”,“9”,“5”,“.”,“.”,“.”],[“.”,“9”,“8”,“.”,“.”,“.”,“.”,“6”,“.”],[“8”,“.”,“.”,“.”,“6”,“.”,“.”,“.”,“3”],[“4”,“.”,“.”,“8”,“.”,“3”,“.”,“.”,“1”],[“7”,“.”,“.”,“.”,“2”,“.”,“.”,“.”,“6”],[“.”,“6”,“.”,“.”,“.”,“.”,“2”,“8”,“.”],[“.”,“.”,“.”,“4”,“1”,“9”,“.”,“.”,“5”],[“.”,“.”,“.”,“.”,“8”,“.”,“.”,“7”,“9”]]
输出:[[“5”,“3”,“4”,“6”,“7”,“8”,“9”,“1”,“2”],[“6”,“7”,“2”,“1”,“9”,“5”,“3”,“4”,“8”],[“1”,“9”,“8”,“3”,“4”,“2”,“5”,“6”,“7”],[“8”,“5”,“9”,“7”,“6”,“1”,“4”,“2”,“3”],[“4”,“2”,“6”,“8”,“5”,“3”,“7”,“9”,“1”],[“7”,“1”,“3”,“9”,“2”,“4”,“8”,“5”,“6”],[“9”,“6”,“1”,“5”,“3”,“7”,“2”,“8”,“4”],[“2”,“8”,“7”,“4”,“1”,“9”,“6”,“3”,“5”],[“3”,“4”,“5”,“2”,“8”,“6”,“1”,“7”,“9”]]
解释:输入的数独如上图所示,唯一有效的解决方案如下所示:
提示
- board.length == 9
- board[i].length == 9
- board[i][j] 是一位数字或者 ‘.’
- 题目数据 保证 输入数独仅有一个解
代码解析
class Solution {
public:bool cheack( vector<vector<char>>& board , int row ,int col ,int val){for(int i=0 ; i< board[0].size() ;i++) //检查行{if(board[row][i] == val ){return false;}}for(int i=0 ; i< board.size() ;i++) //检查列{if(board[i][col] == val){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] == val){return false;}}}return true;}bool backtarking(vector<vector<char>>& board){for(int i=0 ; i< board.size() ; i++) //递归行{for(int j=0 ; j<board[0].size() ;j++)//递归列{if(board[i][j] != '.') continue;//已有的跳过for( char k = '1' ; k<='9';k++){if(cheack(board,i,j,k)) //检查当前k是否符合{board[i][j] = k;if(backtarking(board)) return true; //当找到一组成功的,就不接着找了直接返回trueboard[i][j] = '.';}}return false ;}}return true;//行和列都满足了,返回找到}void solveSudoku(vector<vector<char>>& board) {bool tmp = backtarking(board);}
};
相关文章:

算法学习——LeetCode力扣回溯篇4
算法学习——LeetCode力扣回溯篇4 332. 重新安排行程 332. 重新安排行程 - 力扣(LeetCode) 描述 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票…...
c++ STL系列——(六)multimap
C标准模板库(STL)是C编程中不可或缺的一部分,它提供了一系列的容器、算法和函数模板,以简化常见的数据结构和算法的实现。在STL中,multimap是一个非常有用的容器,它提供了一种键值对的存储方式,…...
Json-序列化字符串时间格式问题
序列化字符串时间格式问题 一、项目场景二、问题描述三、解决方案 一、项目场景 最近C#中需要将实体进行json序列化,使用了Newtonsoft.Json public static void TestJson(){DataTable dt new DataTable();dt.Columns.Add("Age", Type.GetType("Sys…...

HarmonyOS鸿蒙学习基础篇 - 自定义组件(一)
前言 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常不是简单的将系统组件进行组合使用,而是需要考虑代码可复用性、业务逻辑与UI分离&#…...

开窗,挖槽,放电齿,拼版
我们在阻焊层画线,就相当于去掉绿油阻焊,开窗一般是用在大电流走线的时候。先画要走的导线,之后切换到TopSolder或者Bottom Solder层,然后Place->line 画一条和原来先粗细一样的线即可!但走电流的仍然是导线&#x…...
[Vue的组件通讯.sync修饰]Vue中.sync的使用方法和实现的方式 代码注释
目录 .sync的使用方法1. 在父组件中,将需要传递给子组件的数据使用v-bind绑定到子组件的props中,并在属性名后加上.sync修饰符,如下所示:2. 在子组件中,将需要传递给父组件的数据使用$emit方法触发一个名为update:valu…...

Java 基于springboot+vue在线外卖点餐系统,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

Decian 12.x基于LNMP安装phpIPAM(IP管理系统)
phpipam是一个开源Web IP地址管理应用程序(IPAM)。其目标是提供轻便,且有用的IP地址管理系统。它是基于PHP的应用程序,具有MySQL数据库后端,使用jQuery库,ajax和HTML5 / CSS3功能。 在Debian 12中&…...

【多模态MLLMs+图像编辑】MGIE:苹果开源基于指令和大语言模型的图片编辑神器(24.02.03开源)
项目主页:https://mllm-ie.github.io/ 论文 :基于指令和多模态大语言模型图片编辑 2309.Guiding Instruction-based Image Editing via Multimodal Large Language Models (加州大学圣巴拉分校苹果) 代码:https://github.com/appl…...
hpp文件:C++开发中的利器
1 什么是hpp文件? hpp文件是C程序中一种特殊头文件,它可以包含类的声明和实现。与传统的h文件相比,hpp文件具有以下特点: 将类的声明和实现放在同一个文件里,减少了代码量,提高了代码的可读性。无需再将c…...
如何查看电脑连接的wifi的密码
问题 很多时候我们电脑连上wifi之后就把密码忘记了,这个时候如果同事问自己密码是多少,如果作为程序员说不知道是不是感觉有点不好意思,哈哈…… 解决 我使用的是windows电脑,就以windows为例说明下自己是如何查看的。 打开wi…...

QTabWidget和QTabBar控件样式设置(qss)
QTabWidget和QTabBar控件样式设置 1、QTabWidget样式可自定义的有哪些示例:效果图 2、QTabBar样式可自定义的有哪些示例效果图 1、QTabWidget样式可自定义的有哪些 QTabWidget::pane{} 定义tabWidgetFrameQTabWidget::tab-bar{} 定义TabBar的位置QTabWidget::tab{}定…...

【智能家居入门3】(MQTT服务器、MQTT协议、微信小程序、STM32)
前面已经写了三篇博客关于智能家居的,服务器全都是使用ONENET中国移动,他最大的优点就是作为数据收发的中转站是免费的。本篇使用专门适配MQTT协议的MQTT服务器,有公用的,也可以自己搭建(应该要钱)…...

C语言第二十四弹---指针(八)
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1、数组和指针笔试题解析 1.1、字符数组 1.1.1、代码1: 1.1.2、代码2: 1.1.3、代码3: 1.1.4、代码4: 1…...
m1芯片xcode15编译cocos2dx一些报错处理
报错1: No matching function for call to ‘iconv’ No matching function for call to ‘iconv_close’ 解决: 强转: iconv_close((iconv_t)_iconv); iconv((iconv_t)_iconv, (char**)&pin, &inLen, &pout, &outLen); 报错2: Proper…...

代码+视频基于R语言进行K折交叉验证
我们在建立数据模型后通常希望在外部数据验证模型的检验能力。然而当没有外部数据可以验证的时候,交叉验证也不失为一种方法。交叉验验证(交叉验证,CV)则是一种评估模型泛化能力的方法,广泛应用…...

第一篇【传奇开心果系列】Python的pyttsx3库技术点案例示例:文本转换语言
传奇开心果短博文系列 系列短博文目录Python的pyttsx3库技术点案例示例系列 短博文目录前言一、pyttsx3主要特点和功能介绍二、pyttsx3文字转语音操作步骤介绍三、多平台支持介绍和示例代码四、多语言支持介绍和示例代码五、自定义语言引擎介绍和示例代码六、调整语速和音量介绍…...
@ 代码随想录算法训练营第7周(C语言)|Day43(动态规划)
代码随想录算法训练营第7周(C语言)|Day43(动态规划) Day41、动态规划(包含题目 ● 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零 ) 1049. 最后一块石头的重量 II 题目描述 有一堆石头&am…...

深度学习的新进展:探索人工智能的未来
文章目录 📑引言深度学习技术概述计算机视觉领域的深度应用自然语言处理的深度革命跨领域应用的深度拓展深度学习的挑战与未来展望结语 📑引言 在科技日新月异的今天,深度学习作为人工智能领域的一颗璀璨明珠,正在引领着技术创新…...
Vue中@change、@input和@blur、@focus的区别及@keyup介绍
Vue中change、input和blur、focus的区别及keyup介绍 1. change、input、blur、focus事件2. keyup事件3. 补充:el-input的change事件自定义传参 1. change、input、blur、focus事件 change在输入框发生变化且失去焦点后触发; input在输入框内容发生变化后…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...