建设网站查证书,网络营销发展的新趋势,淘宝上开做网站的店铺,盲盒怎么制作教程#x1f4dd;个人主页#xff1a;Sherry的成长之路 #x1f3e0;学习社区#xff1a;Sherry的成长之路#xff08;个人社区#xff09; #x1f4d6;专栏链接#xff1a;练题 #x1f3af;长路漫漫浩浩#xff0c;万事皆有期待 文章目录 重新安排行程N 皇后解数独总… 个人主页Sherry的成长之路 学习社区Sherry的成长之路个人社区 专栏链接练题 长路漫漫浩浩万事皆有期待 文章目录 重新安排行程N 皇后解数独总结 重新安排行程
LeetCode 332. 重新安排行程 题目描述给你一份航线列表 tickets 其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK肯尼迪国际机场出发的先生所以该行程必须从 JFK 开始。如果存在多种有效的行程请你按字典排序返回最小的行程组合。 例如行程 [“JFK”, “LGA”] 与 [“JFK”, “LGB”] 相比就更小排序更靠前。 假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。 示例 1
示例1输入tickets [[“MUC”,“LHR”],[“JFK”,“MUC”],[“SFO”,“SJC”],[“LHR”,“SFO”]] 输出[“JFK”,“MUC”,“LHR”,“SFO”,“SJC”]
思路 这道题目有几个难点 一个行程中如果航班处理不好容易变成一个圈成为死循环 有多种解法字母序靠前排在前面让很多同学望而退步如何该记录映射关系呢 使用回溯法也可以说深搜 的话那么终止条件是什么呢 搜索的过程中如何遍历一个机场所对应的所有机场。
class Solution {
public:unordered_mapstring,mapstring,int targets;bool backtracking(int ticketNum,vectorstringresult){if(result.size()ticketNum1){return true;}for(pairconst string,int target: targets[result[result.size()-1]]){if(target.second0){result.push_back(target.first);target.second--;if(backtracking(ticketNum,result)){return true;}result.pop_back();target.second;}}return false;}vectorstring findItinerary(vectorvectorstring tickets) {targets.clear();vectorstring result;for(const vectorstringvec:tickets){targets[vec[0]][vec[1]];}result.push_back(JFK);backtracking(tickets.size(),result);return result;}
};N 皇后
LeetCode 51 N 皇后 题目描述按照国际象棋的规则皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上并且使皇后彼此之间不能相互攻击。 给你一个整数 n 返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。
示例1输入n 4 输出[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]] 解释如下图所示4 皇后问题存在两个不同的解法
示例2输入n 1 输出[[“Q”]]
class Solution {
public:vectorvectorstring result;void backtracking(int n,int row,vectorstring chessboard){if(rown){result.push_back(chessboard);return;}for(int col0;coln;col){if(isValid(row,col,chessboard,n)){chessboard[row][col]Q;backtracking(n,row1,chessboard);chessboard[row][col].;}}}bool isValid(int row,int col,vectorstringchessboard,int n){for(int i0;irow;i){if(chessboard[i][col]Q){return false;}}for(int irow-1,jcol-1;i0j0;i--,j--){if(chessboard[i][j]Q){return false;}}for(int irow-1,jcol1;i0j0;i--,j){if(chessboard[i][j]Q){return false;}}return true;}vectorvectorstring solveNQueens(int n) {result.clear();vectorstring chessboard(n,string(n,.));backtracking(n,0,chessboard);return result;}
};解数独
LeetCode 37 解数独 题目描述编写一个程序通过填充空格来解决数独问题。 数独的解法需 遵循如下规则 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。请参考示例图 数独部分空格内已填入了数字空白格用 ‘.’ 表示。
示例 解释输入的数独如上图所示唯一有效的解决方案如下所示 class Solution {
public:bool backtracking(vectorvectorchar board){for(int i0;iboard.size();i){for(int j0;jboard[0].size();j){if(board[i][j].){for(char k1;k9;k){if(isValid(i,j,k,board)){board[i][j]k;if(backtracking(board)){return true;}board[i][j].;}}return false;}}}return true;}bool isValid(int row,int col,char val,vectorvectorchar board){for(int i0;i9;i){if(board[row][i]val){return false;}}for(int j0;j9;j){if(board[j][col]val){return false;}}int startRow(row/3)*3;int startCol(col/3)*3;for(int istartRow;istartRow3;i){for(int jstartCol;jstartCol3;j){if(board[i][j]val){return false;}}}return true;}void solveSudoku(vectorvectorchar board) {backtracking(board);}
};总结这三道回溯题我是一题没看懂一刷大概了解一下吧废了不过N皇后挺经典的这三题还是要掌握。
总结
今天我们完成了重新安排行程、N 皇后、解数独三道题相关的思想需要多复习回顾。接下来我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。 当然本文仍有许多不足之处欢迎各位小伙伴们随时私信交流、批评指正我们下期见~