精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我們一起聊聊重新安排行程!

開發(fā) 前端
給定一個機票的字符串二維數(shù)組 [from, to],子數(shù)組中的兩個成員分別表示飛機出發(fā)和降落的機場地點,對該行程進行重新規(guī)劃排序。

[[429150]]

這也可以用回溯法?其實深搜和回溯也是相輔相成的,畢竟都用遞歸。

給定一個機票的字符串二維數(shù)組 [from, to],子數(shù)組中的兩個成員分別表示飛機出發(fā)和降落的機場地點,對該行程進行重新規(guī)劃排序。所有這些機票都屬于一個從 JFK(肯尼迪國際機場)出發(fā)的先生,所以該行程必須從 JFK 開始。

提示:

  • 如果存在多種有效的行程,請你按字符自然排序返回最小的行程組合。例如,行程 ["JFK", "LGA"] 與 ["JFK", "LGB"] 相比就更小,排序更靠前
  • 所有的機場都用三個大寫字母表示(機場代碼)。
  • 假定所有機票至少存在一種合理的行程。
  • 所有的機票必須都用一次 且 只能用一次。

示例 1:

  • 輸入:[["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]]
  • 輸出:["JFK", "MUC", "LHR", "SFO", "SJC"]

示例 2:

  • 輸入:[["JFK","SFO"],["JFK","ATL"],["SFO","ATL"],["ATL","JFK"],["ATL","SFO"]]
  • 輸出:["JFK","ATL","JFK","SFO","ATL","SFO"]
  • 解釋:另一種有效的行程是 ["JFK","SFO","ATL","JFK","ATL","SFO"]。但是它自然排序更大更靠后。

思路 

這道題目還是很難的,之前我們用回溯法解決了如下問題:組合問題,分割問題,子集問題,排列問題。

直覺上來看 這道題和回溯法沒有什么關(guān)系,更像是圖論中的深度優(yōu)先搜索。

實際上確實是深搜,但這是深搜中使用了回溯的例子,在查找路徑的時候,如果不回溯,怎么能查到目標路徑呢。

所以我傾向于說本題應(yīng)該使用回溯法,那么我也用回溯法的思路來講解本題,其實深搜一般都使用了回溯法的思路,在圖論系列中我會再詳細講解深搜。

這里就是先給大家拓展一下,原來回溯法還可以這么玩!

這道題目有幾個難點:

  1. 一個行程中,如果航班處理不好容易變成一個圈,成為死循環(huán)
  2. 有多種解法,字母序靠前排在前面,讓很多同學(xué)望而退步,如何該記錄映射關(guān)系呢 ?
  3. 使用回溯法(也可以說深搜) 的話,那么終止條件是什么呢?
  4. 搜索的過程中,如何遍歷一個機場所對應(yīng)的所有機場。

針對以上問題我來逐一解答!

如何理解死循環(huán)

對于死循環(huán),我來舉一個有重復(fù)機場的例子:

重新安排行程

為什么要舉這個例子呢,就是告訴大家,出發(fā)機場和到達機場也會重復(fù)的,如果在解題的過程中沒有對集合元素處理好,就會死循環(huán)。

該記錄映射關(guān)系

有多種解法,字母序靠前排在前面,讓很多同學(xué)望而退步,如何該記錄映射關(guān)系呢 ?

一個機場映射多個機場,機場之間要靠字母序排列,一個機場映射多個機場,可以使用std::unordered_map,如果讓多個機場之間再有順序的話,就是用std::map 或者std::multimap 或者 std::multiset。

如果對map 和 set 的實現(xiàn)機制不太了解,也不清楚為什么 map、multimap就是有序的同學(xué),可以看這篇文章關(guān)于哈希表,你該了解這些!。

這樣存放映射關(guān)系可以定義為 unordered_map

含義如下:

這兩個結(jié)構(gòu),我選擇了后者,因為如果使用unordered_map

再說一下為什么一定要增刪元素呢,正如開篇我給出的圖中所示,出發(fā)機場和到達機場是會重復(fù)的,搜索的過程沒及時刪除目的機場就會死循環(huán)。

所以搜索的過程中就是要不斷的刪multiset里的元素,那么推薦使用unordered_map

在遍歷 unordered_map<出發(fā)機場, map<到達機場, 航班次數(shù)>> targets的過程中,可以使用"航班次數(shù)"這個字段的數(shù)字做相應(yīng)的增減,來標記到達機場是否使用過了。

如果“航班次數(shù)”大于零,說明目的地還可以飛,如果如果“航班次數(shù)”等于零說明目的地不能飛了,而不用對集合做刪除元素或者增加元素的操作。

相當于說我不刪,我就做一個標記!

回溯法

這道題目我使用回溯法,那么下面按照我總結(jié)的回溯模板來:

  1. void backtracking(參數(shù)) { 
  2.     if (終止條件) { 
  3.         存放結(jié)果; 
  4.         return
  5.     } 
  6.  
  7.     for (選擇:本層集合中元素(樹中節(jié)點孩子的數(shù)量就是集合的大?。? { 
  8.         處理節(jié)點; 
  9.         backtracking(路徑,選擇列表); // 遞歸 
  10.         回溯,撤銷處理結(jié)果 
  11.     } 

本題以輸入:[["JFK", "KUL"], ["JFK", "NRT"], ["NRT", "JFK"]為例,抽象為樹形結(jié)構(gòu)如下:

.重新安排行程1

開始回溯三部曲講解:

  • 遞歸函數(shù)參數(shù)

在講解映射關(guān)系的時候,已經(jīng)講過了,使用unordered_map

當然把參數(shù)放進函數(shù)里傳進去也是可以的,我是盡量控制函數(shù)里參數(shù)的長度。

參數(shù)里還需要ticketNum,表示有多少個航班(終止條件會用上)。

代碼如下:

  1. // unordered_map<出發(fā)機場, map<到達機場, 航班次數(shù)>> targets 
  2. unordered_map<string, map<string, int>> targets; 
  3. bool backtracking(int ticketNum, vector<string>& result) { 

注意函數(shù)返回值我用的是bool!

我們之前講解回溯算法的時候,一般函數(shù)返回值都是void,這次為什么是bool呢?

因為我們只需要找到一個行程,就是在樹形結(jié)構(gòu)中唯一的一條通向葉子節(jié)點的路線,如圖:

重新安排行程1

所以找到了這個葉子節(jié)點了直接返回,這個遞歸函數(shù)的返回值問題我們在講解二叉樹的系列的時候,在這篇二叉樹:遞歸函數(shù)究竟什么時候需要返回值,什么時候不要返回值?詳細介紹過。

當然本題的targets和result都需要初始化,代碼如下:

  1. for (const vector<string>& vec : tickets) { 
  2.     targets[vec[0]][vec[1]]++; // 記錄映射關(guān)系 
  3. result.push_back("JFK"); // 起始機場 
  • 遞歸終止條件

拿題目中的示例為例,輸入: [["MUC", "LHR"], ["JFK", "MUC"], ["SFO", "SJC"], ["LHR", "SFO"]] ,這是有4個航班,那么只要找出一種行程,行程里的機場個數(shù)是5就可以了。

所以終止條件是:我們回溯遍歷的過程中,遇到的機場個數(shù),如果達到了(航班數(shù)量+1),那么我們就找到了一個行程,把所有航班串在一起了。

代碼如下:

  1. if (result.size() == ticketNum + 1) { 
  2.     return true

已經(jīng)看習(xí)慣回溯法代碼的同學(xué),到葉子節(jié)點了習(xí)慣性的想要收集結(jié)果,但發(fā)現(xiàn)并不需要,本題的result相當于 回溯算法:求組合總和!中的path,也就是本題的result就是記錄路徑的(就一條),在如下單層搜索的邏輯中result就添加元素了。

  • 單層搜索的邏輯

回溯的過程中,如何遍歷一個機場所對應(yīng)的所有機場呢?

這里剛剛說過,在選擇映射函數(shù)的時候,不能選擇unordered_map

可以說本題既要找到一個對數(shù)據(jù)進行排序的容器,而且還要容易增刪元素,迭代器還不能失效。

所以我選擇了unordered_map

遍歷過程如下:

  1. for (pair<const string, int>& target : targets[result[result.size() - 1]]) { 
  2.     if (target.second > 0 ) { // 記錄到達機場是否飛過了 
  3.         result.push_back(target.first); 
  4.         target.second--; 
  5.         if (backtracking(ticketNum, result)) return true
  6.         result.pop_back(); 
  7.         target.second++; 
  8.     } 

可以看出 通過unordered_map

分析完畢,此時完整C++代碼如下:

  1. class Solution { 
  2. private: 
  3. // unordered_map<出發(fā)機場, map<到達機場, 航班次數(shù)>> targets 
  4. unordered_map<string, map<string, int>> targets; 
  5. bool backtracking(int ticketNum, vector<string>& result) { 
  6.     if (result.size() == ticketNum + 1) { 
  7.         return true
  8.     } 
  9.     for (pair<const string, int>& target : targets[result[result.size() - 1]]) { 
  10.         if (target.second > 0 ) { // 記錄到達機場是否飛過了 
  11.             result.push_back(target.first); 
  12.             target.second--; 
  13.             if (backtracking(ticketNum, result)) return true
  14.             result.pop_back(); 
  15.             target.second++; 
  16.         } 
  17.     } 
  18.     return false
  19. public
  20.     vector<string> findItinerary(vector<vector<string>>& tickets) { 
  21.         targets.clear(); 
  22.         vector<string> result; 
  23.         for (const vector<string>& vec : tickets) { 
  24.             targets[vec[0]][vec[1]]++; // 記錄映射關(guān)系 
  25.         } 
  26.         result.push_back("JFK"); // 起始機場 
  27.         backtracking(tickets.size(), result); 
  28.         return result; 
  29.     } 
  30. }; 

一波分析之后,可以看出我就是按照回溯算法的模板來的。

代碼中

  1. for (pair<const string, int>& target : targets[result[result.size() - 1]]) 

pair里要有const,因為map中的key是不可修改的,所以是pair。

如果不加const,也可以復(fù)制一份pair,例如這么寫:

  1. for (pairtarget : targets[result[result.size() - 1]]) 

總結(jié)

本題其實可以算是一道hard的題目了,關(guān)于本題的難點我在文中已經(jīng)列出了。

如果單純的回溯搜索(深搜)并不難,難還難在容器的選擇和使用上。

本題其實是一道深度優(yōu)先搜索的題目,但是我完全使用回溯法的思路來講解這道題題目,算是給大家拓展一下思維方式,其實深搜和回溯也是分不開的,畢竟最終都是用遞歸。

如果最終代碼,發(fā)現(xiàn)照著回溯法模板畫的話好像也能畫出來,但難就難如何知道可以使用回溯,以及如果套進去,所以我再寫了這么長的一篇來詳細講解。

 

責(zé)任編輯:武曉燕 來源: 代碼隨想錄
相關(guān)推薦

2024-02-20 21:34:16

循環(huán)GolangGo

2021-08-27 07:06:10

IOJava抽象

2023-06-30 08:18:51

敏捷開發(fā)模式

2022-05-24 08:21:16

數(shù)據(jù)安全API

2023-08-10 08:28:46

網(wǎng)絡(luò)編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-09-10 21:42:31

2023-07-27 07:46:51

SAFe團隊測試

2022-06-26 09:40:55

Django框架服務(wù)

2023-12-28 09:55:08

隊列數(shù)據(jù)結(jié)構(gòu)存儲

2022-10-28 07:27:17

Netty異步Future

2022-11-12 12:33:38

CSS預(yù)處理器Sass

2022-02-14 07:03:31

網(wǎng)站安全MFA

2022-04-06 08:23:57

指針函數(shù)代碼

2025-03-27 02:00:00

SPIJava接口

2024-02-26 00:00:00

Go性能工具

2022-12-07 13:12:15

2022-01-04 12:08:46

設(shè)計接口

2022-07-29 08:17:46

Java對象內(nèi)存

2023-04-26 07:30:00

promptUI非結(jié)構(gòu)化
點贊
收藏

51CTO技術(shù)棧公眾號

久久久久久久久久久妇女| 色综合一区二区日本韩国亚洲| 岛国一区二区在线观看| 欧美亚洲视频在线观看| 影音先锋男人在线| 最新国产一区二区| 91九色02白丝porn| 久久久久福利视频| 国产www.大片在线| 国产成人免费视频网站| 国产精品草莓在线免费观看| 国产1区2区3区4区| 精品国产91| 亚洲丁香婷深爱综合| 免费看黄色一级大片| 欧美1—12sexvideos| 国产精品天干天干在观线| 国产精品毛片va一区二区三区| 日本成人一级片| 在线观看一区视频| 另类视频在线观看| 91激情视频在线观看| 成人自拍在线| 欧美一区日本一区韩国一区| 亚洲免费av一区二区三区| 久操av在线| 亚洲乱码精品一二三四区日韩在线| 免费日韩电影在线观看| 性一交一乱一伧老太| 激情五月婷婷综合| 国产精品午夜一区二区欲梦| 91九色丨porny丨肉丝| 亚洲精品一二三区区别| 在线观看日韩av| 国产中文字幕一区二区| 一区三区自拍| 日韩欧美专区在线| 久久久九九九热| av在线亚洲一区| 欧美挠脚心视频网站| 黄色国产小视频| 亚洲精品永久免费视频| 婷婷夜色潮精品综合在线| 日韩激情视频一区二区| 在线中文字幕视频观看| 1024国产精品| 中文字幕欧美人与畜| se在线电影| 国产精品全国免费观看高清| 日韩精品不卡| jizz亚洲| 国产精品狼人久久影院观看方式| 亚洲欧美电影在线观看| 自拍视频在线网| 国产三级三级三级精品8ⅰ区| 欧美激情专区| 欧美男男激情freegay| 337p粉嫩大胆噜噜噜噜噜91av| 国产一区二区自拍| 日本精品久久久久| 91在线观看高清| 日本精品二区| 91看片在线观看| 国产精品久久久久久亚洲伦| 中文字幕中文字幕在线中心一区| 最近高清中文在线字幕在线观看| 日韩美女啊v在线免费观看| 中文字幕超清在线免费观看| 18+激情视频在线| 亚洲午夜三级在线| 欧美色图另类小说| 成人午夜sm精品久久久久久久| 欧美日韩一区二区三区在线| 欧美日韩中文不卡| 视频二区欧美| 亚洲欧美国产一区二区三区| 99久久99久久精品免费| 久久久久国产| 97高清免费视频| 无码任你躁久久久久久久| 日本成人在线一区| 亚洲自拍欧美另类| 午夜视频1000| 国产精品久线在线观看| 国产精品久久国产| 欧美精品高清| 欧美一区二区啪啪| 97人妻天天摸天天爽天天| 日韩久久综合| 久久久久久国产免费| 成人小视频在线播放| 国内精品视频666| 精品一区二区三区国产| 亚洲麻豆精品| 亚洲成人激情av| 999精品视频在线| 日韩一区二区三区高清在线观看| 亚洲精品97久久| 亚洲色图日韩精品| 99精品视频免费| 成人中文字幕在线观看| 香蕉视频免费在线看| 国产精品成人免费| 日本中文字幕片| 日韩中文字幕在线一区| 中文字幕亚洲字幕| 国产69精品久久久久久久久久| 久久国产精品无码网站| 久久精品国产一区二区三区日韩| 暖暖日本在线观看| 欧美性精品220| 肉丝美足丝袜一区二区三区四| 九九亚洲视频| 久久久久久综合网天天| 一区二区三区黄色片| 91蜜桃网址入口| 男人天堂新网址| 免费一级欧美在线观看视频| 日韩国产精品亚洲а∨天堂免| 侵犯稚嫩小箩莉h文系列小说| 国产一区二区高清| 91成人免费观看| 91精品专区| 色婷婷综合中文久久一本| 免费黄色a级片| 亚洲欧美日韩高清在线| 国产精品久久久久一区二区| 四虎精品在永久在线观看 | 亚洲精选成人| 亚洲淫片在线视频| 在线观看av的网站| 在线亚洲免费视频| 久久久精品人妻无码专区| 国内精品久久久久久久影视蜜臀 | 午夜精品一区二区三区电影天堂 | av网站在线不卡| 精品一区毛片| 国产91|九色| 天堂网av在线播放| 亚洲午夜电影网| 又大又长粗又爽又黄少妇视频| 亚洲激情中文| 91视频免费网站| 欧美日韩在线资源| 欧美美女激情18p| 国产精品免费在线视频| 免费高清在线一区| 一区二区三区我不卡| 久久久久久久性潮| 久久中文字幕在线| 超碰免费在线97| 亚洲永久精品大片| 涩视频在线观看| 日韩一区二区免费看| 久久久久久99| 桃子视频成人app| 亚洲视频777| 一区二区三区在线免费观看视频| 日本一区二区三区在线观看| 别急慢慢来1978如如2| 精品大片一区二区| 成人黄色午夜影院| 牛牛精品视频在线| 亚洲精品按摩视频| 91porny九色| 中文字幕中文在线不卡住| 伊人色在线视频| 欧美视频福利| 老牛影视免费一区二区| 欧美成人精品三级网站| 久久精品国产久精国产思思| www.成人精品| 欧美日韩在线一区| 国产成人免费在线观看视频| 国产成人综合自拍| 国产在线观看福利| 99久久夜色精品国产亚洲96 | 婷婷综合成人| 国产精品美女www| 四虎亚洲成人| 亚洲欧洲一区二区三区久久| 亚洲天堂一二三| 一区二区欧美视频| 性少妇bbw张开| 国产中文字幕一区| 久久久999视频| 色狮一区二区三区四区视频| 国产乱码精品一区二区三区不卡| 四虎成人在线| 欧美激情精品久久久久| 黄色在线观看网| 日韩欧美国产综合| 欧美国产一级片| 亚洲在线成人精品| 国产又黄又粗又猛又爽的| 成人一区在线观看| 日本特黄a级片| 极品中文字幕一区| 亚洲国产成人不卡| 色婷婷久久久| 99国产超薄丝袜足j在线观看| sese综合| 久久久久久91| 2021av在线| 日韩av在线免费观看| 国产又大又黄的视频| 日韩欧美极品在线观看| 欧美精品久久久久性色| 亚洲国产高清在线观看视频| 亚州av综合色区无码一区| 国产揄拍国内精品对白| 成熟老妇女视频| 伊人成人在线| av久久久久久| 国产电影一区二区在线观看| 欧美午夜精品久久久久久蜜| 国产欧美啪啪| 亚洲一区二区三区毛片| jvid一区二区三区| 青青草原一区二区| av免费不卡国产观看| 久久久精品免费| av在线之家电影网站| 亚洲精品小视频| 黄色一级大片在线免费看国产| 欧美老年两性高潮| 中文字幕精品一区二| 日本韩国一区二区三区| 亚洲免费激情视频| 一区二区高清免费观看影视大全| 日韩av网站在线播放| 国产日韩精品一区二区三区| 五月婷婷综合在线观看| 99久久综合99久久综合网站| 又大又长粗又爽又黄少妇视频| 国产精品一区在线观看乱码 | 黄色网址中文字幕| 欧美日韩免费区域视频在线观看| 国产亚洲欧美精品久久久www | jizz国产精品| 成人免费视频在线观看超级碰| 国产成人a视频高清在线观看| 国产成人在线一区| 秋霞国产精品| 国产精品视频色| 色8久久久久| 亚洲一区久久久| 亚洲精品在线a| 福利视频一区二区三区| 成人看片爽爽爽| 久久精品国产综合精品| 色婷婷综合久久久久久| 青青成人在线| 日韩精品一区二区三区免费观影| 亚洲欧美日韩国产yyy| 成人嫩草影院| 香蕉视频在线网址| 欧美三级免费| 精品国产一区三区| 久久免费国产| 不卡的在线视频| 国产激情视频一区二区三区欧美| 久久人妻少妇嫩草av蜜桃| 99久久久国产精品免费蜜臀| 欧美图片一区二区| 国产精品欧美综合在线| 日韩成人短视频| 午夜精彩视频在线观看不卡| 亚洲自拍一区在线观看| 欧美性大战久久久久久久 | 国产精品影视天天线| 秘密基地免费观看完整版中文| 91在线国产福利| 五月天免费网站| 亚洲最大的成人av| 久久久久久不卡| 91精品国产入口在线| 人妻中文字幕一区| 亚洲无限av看| aa在线视频| 青青a在线精品免费观看| 亚洲精品777| 国产一区免费在线观看| 欧美亚洲国产一区| 99er在线视频| 日本美女一区二区三区| 精品伦一区二区三区| 国产欧美一区二区精品性| 麻豆国产尤物av尤物在线观看 | 亚洲天堂福利av| 日韩网红少妇无码视频香港| 欧美日韩一区二区三区高清| 亚洲国产成人一区二区| 中文字幕欧美专区| 91美女主播在线视频| 国产日韩欧美夫妻视频在线观看 | 日韩中文字在线| 91jq激情在线观看| 国产主播喷水一区二区| 日韩理论电影中文字幕| 熟女视频一区二区三区| 久久先锋影音| 69亚洲乱人伦| 亚洲欧美另类在线| 最近中文字幕在线观看| 亚洲国产97在线精品一区| 免费黄网在线观看| 国产不卡一区二区在线播放| 6080亚洲理论片在线观看| 亚洲午夜在线观看| 新67194成人永久网站| 初高中福利视频网站| 国产精品久久毛片a| 亚洲熟妇无码乱子av电影| 欧美电影免费观看完整版| 日本视频在线| 欧美最顶级丰满的aⅴ艳星| 91国内精品| 特大黑人娇小亚洲女mp4| 麻豆精品视频在线观看视频| aaaaaav| 夜夜爽夜夜爽精品视频| 国产又粗又猛又爽又黄91| 国产一区二区三区日韩欧美| 在线观看福利电影| 国产一区免费视频| 亚洲高清资源| 337p日本欧洲亚洲大胆张筱雨| 亚洲欧洲另类国产综合| 在线观看国产精品视频| 亚洲性夜色噜噜噜7777| 在线黄色的网站| 久久免费一区| 国产亚洲一级| 国内精品久久99人妻无码| 午夜久久电影网| 天天操天天干天天| 91精品国产91久久久久久久久 | 精品国模一区二区三区| 欧美激情一区二区三区在线视频| 国产日韩高清一区二区三区在线| 亚洲无人区码一码二码三码| 亚洲一区二区在线播放相泽 | 91视频亚洲| 懂色av粉嫩av蜜臀av| 精品一区二区免费视频| 中日韩一级黄色片| 欧美一区二区三区男人的天堂| dy888亚洲精品一区二区三区| 亚洲综合av影视| 欧美午夜国产| chinese麻豆新拍video| 狠狠色噜噜狠狠狠狠97| 国产女人在线观看| 国产美女扒开尿口久久久| 国产精品久久久久久久久久10秀| 久久成年人网站| 一区二区三区加勒比av| 欧美一级特黄aaaaaa| 欧美一区在线直播| 精品一区二区三| 日韩av片专区| 一区av在线播放| 天天干天天干天天干| 国产成人精品视频在线观看| 色综合咪咪久久网| 中文字幕永久免费| 精品久久久久久久中文字幕| 国产视频福利在线| 成人中心免费视频| 一区二区高清| 黄色三级生活片| 精品日韩成人av| 卡通欧美亚洲| 大地资源第二页在线观看高清版| 国产成人免费xxxxxxxx| 中文字幕第15页| 自拍偷拍亚洲精品| caoporn成人免费视频在线| 国产免费人做人爱午夜视频| 国产精品成人在线观看| 人妻无码一区二区三区久久99| 日韩av不卡电影| 欧美有码视频| 无码国产69精品久久久久同性| 欧美一卡二卡三卡| 免费福利视频一区二区三区| 欧美一级免费在线观看| 99久久久精品免费观看国产蜜| 一级黄色片在线| 91a在线视频| 亚洲国产不卡| 亚洲午夜福利在线观看| 91精品国产美女浴室洗澡无遮挡| 午夜影视一区二区三区| 99精品一级欧美片免费播放| 久久久亚洲国产美女国产盗摄| a视频免费在线观看| 国产成人精品电影| 一区在线观看|