力扣日記3.3-【回溯算法篇】332. 重新安排行程

力扣日記:【回溯算法篇】332. 重新安排行程

日期:2023.3.3
參考:代碼隨想錄、力扣
ps:因為是困難題,望而卻步了一星期。。。T^T

332. 重新安排行程

題目描述

難度:困難

給你一份航線列表 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
  • from_i.length == 3
  • to_i.length == 3
  • from_i 和 to_i 由大寫英文字母組成
  • from_i != to_i

題解

cpp ver
class Solution {
public:// 關鍵1:使用 unordered_map targets <string, map<string, int>> 記錄各段航線(<起點, <終點, 航線次數>>)// 一個起點機場可能映射多個終點,所以用unordered_map;// 且相同起點的不同航線之間按字典順序排(即終點機場按字母序排列,按照這種順序進行遍歷得到的行程即滿足題目要求的最小行程),所以用map,其中航線次數記錄剩余次數(為1則表示該航線未走,為有效)vector<string> findItinerary(vector<vector<string>>& tickets) {// 初始化targetsunordered_map<string, map<string, int>> targets;for (const vector<string>& vec : tickets) {targets[vec[0]][vec[1]]++; // 記錄映射關系 vec(即vector<string>)中包含兩個機場,第一個str為起點,第二個為終點}// 初始化pathvector<string> path;path.push_back("JFK");  // 第一個機場一定是JFKbacktracking(tickets.size(), targets, path);return path;}// 返回值與參數:由于只需要一條有效行程,所以當成功收集時,通過返回true來終止各層遞歸// 參數為記錄tickets中的航線數量的ticketNum,記錄各段航線的targets(相當于總集合)// 以及記錄最小有效行程的path(由于只需要一條有效行程,所以不需要results收集path)(這些參數也可以都作為全局變量)bool backtracking(int ticketNum, unordered_map<string, map<string, int>>& targets, vector<string>& path) {// 終止條件:當path中的機場個數為航線數+1時,說明全部航線已走完if (path.size() == ticketNum + 1) {return true;    // 注意這里是返回true,且不再需要results收集path}// for循環// 關鍵2:在樹狀結構中,某一節點的橫向遍歷表示,以當前所在機場為起點,遍歷選取對應目的機場(一個機場對應0或多個目的機場)// 當前所在機場即path中最后一個機場即path[path.size()-1],而targets[起點機場]則記錄了以該機場為起點的對應終點for (pair<const string, int> &target : targets[path[path.size() - 1]]) { // 遍歷各個機場終點<終點,航線次數>// 注意這里target一定要加&才能修改到targets中的航線次數// 而加上引用之后,就必須在 string 前面加上 const,因為map中的key 是不可修改的(語法規定)// 只有當前航線次數>0(表示此航線存在且未走過)才能選取,防止重復走if (target.second > 0) {path.push_back(target.first);   // 存儲該機場target.second--;    // 航線次數-1// 遞歸(關鍵3:通過返回值判斷是否提前結束)if (backtracking(ticketNum, targets, path)) return true;// 如果走了錯誤的路(即遍歷到沒有對應終點了也沒有達到終止條件)則回溯target.second++;path.pop_back();}}return false;}
};

復雜度

時間復雜度:
空間復雜度:

思路總結

  • 見注釋
  • 思路來源于代碼隨想錄

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/718048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/718048.shtml
英文地址,請注明出處:http://en.pswp.cn/news/718048.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

牛客小白月賽86

A-水鹽平衡_牛客小白月賽86 (nowcoder.com) #include<bits/stdc.h> #define endl \n #define int long long using namespace std; int a,b,c,d; void solve() {cin>>a>>b>>c>>d;if((double)a/b>(double)c/d) cout<<S<<endl;els…

關于脈沖負載應用中電阻器,您需要了解的 11 件事?

不幸的是&#xff0c;電阻器在脈沖負載下可能會失效。當脈沖功率耗散到器件的電阻元件時&#xff0c;它會產生熱量并增加電阻器的溫度。過熱會損壞電阻元件&#xff0c;導致電阻變化甚至設備開路。為了避免在設計中出現這種情況&#xff0c;以下是您在選擇元件時應了解的有關電…

excel統計分析——拉丁方設計

參考資料&#xff1a;生物統計學 拉丁方設計也是隨機區組設計&#xff0c;是對隨機區組設計的一種改進。它在行的方向和列的方向都可以看成區組&#xff0c;因此能實現雙向誤差的控制。在一般的試驗設計中&#xff0c;拉丁方常被看作雙區組設計&#xff0c;用于提高發現處理效應…

Skipped breakpoint at because it happened inside debugger evaluation親測可用

問題描述&#xff1a; 在多線程項目中&#xff0c;在idea中打斷點時&#xff0c;有時會遇到下面這種情況&#xff1a; idea左下角出現一行紅底或者綠底文字提示&#xff1a; Skipped breakpoint at because it happened inside debugger evaluation 然后我們能感受到的就是…

HTML中自定義鼠標右鍵菜單

今天突然有人跟我提到了HTML中如何自定義鼠標右鍵菜單&#xff0c;這里大概記錄一下吧&#xff0c;方便下次直接復制。免得還去看API文檔。 文章目錄 HTML中自定義鼠標右鍵菜單結果如下所示可以稍微改一下鼠標懸浮到右鍵菜單時的樣式結果如下所示 只在某個特定的div才可以顯示…

javascript 的eval()和with是干嘛的

原來JavaScript 中的eval() 和 with 是兩個強大的功能&#xff0c;但同時它們也具有潛在風險的特性&#xff0c;所以謹慎使用。 首先說說eval() 函數&#xff1a; 它接收一個字符串參數&#xff0c;并將其作為 JavaScript 代碼來解析和執行。 這意味著你可以使用 eval() 動態地…

《Scratch等級認證CCF-GESP真題解析》專欄總目錄

?? 專欄名稱:《Scratch等級認證CCF-GESP真題解析》 ?? 專欄介紹:中國計算機學會GESP《CCF編程能力等級認證》Scratch圖形化編程(1~4級)歷屆真題解析。 ?? 訂閱專欄:訂閱后可閱讀專欄內所有真題解析,真題持續更新中,限時9.9元,歡迎訂閱! Scratch圖形化編程一級 序…

2368. 受限條件下可到達節點的數目

2368. 受限條件下可到達節點的數目 題目鏈接&#xff1a;2368. 受限條件下可到達節點的數目 代碼如下&#xff1a; //深度優先遍歷 //參考&#xff1a;https://leetcode.cn/problems/reachable-nodes-with-restrictions/solutions/2662538/shu-shang-dfspythonjavacgojsrust-…

C++自學精簡實踐教程

一、介紹 1.1 教程特點 一篇文章從入門到就業有圖有真相&#xff0c;有測試用例&#xff0c;有作業&#xff1b;提供框架代碼&#xff0c;作業只需要代碼填空規范開發習慣&#xff0c;培養設計能力 1.2 參考書 唯一參考書《C Primer 第5版》?參考書下載&#xff1a; 藍奏云…

Acwing---3777. 磚塊

磚塊 1.題目2.基本思想3.代碼實現 1.題目 n 個磚塊排成一排&#xff0c;從左到右編號依次為 1~n。 每個磚塊要么是黑色的&#xff0c;要么是白色的。 現在你可以進行以下操作若干次&#xff08;可以是 0 次&#xff09;&#xff1a; 選擇兩個相鄰的磚塊&#xff0c;反轉它…

STL——stack

目錄 stack stack都有哪些接口 模擬實現一個stack stack 1. stack是一種容器適配器&#xff0c;專門用在具有后進先出操作的上下文環境中&#xff0c;其刪除只能從容器的一端進行元素的插入與提取操作。 2. stack是作為容器適配器被實現的&#xff0c;容器適配器即…

數據分析-Pandas數據的畫圖設置

數據分析-Pandas數據的畫圖設置 數據分析和處理中&#xff0c;難免會遇到各種數據&#xff0c;那么數據呈現怎樣的規律呢&#xff1f;不管金融數據&#xff0c;風控數據&#xff0c;營銷數據等等&#xff0c;莫不如此。如何通過圖示展示數據的規律&#xff1f; 數據表&#x…

春招!啟動了

大家好&#xff0c;我是洋子。今年的春招很多企業已經開始招聘了&#xff0c;像美團今年繼續發力&#xff0c;24屆春招以及25屆暑期轉正實習一共招聘4000人。另外&#xff0c;阿里&#xff0c;京東&#xff0c;順豐等公司也已經開始春招&#xff0c;可以說招聘的號角已經正式吹…

GO語言學習筆記(與Java的比較學習)(十)

錯誤處理與測試 Go 沒有像 Java 和 .NET 那樣的 try/catch 異常機制&#xff1a;不能執行拋異常操作。但是有一套 defer-panic-and-recover 機制 錯誤處理 Go 有一個預先定義的 error 接口類型 type error interface {Error() string } errors 包中有一個 errorString 結構…

十二、類與聲明

類與聲明 什么是類&#xff1f; 前情總結 前面22講的課基本上就做了兩件事 學習C#的基本元素學習類的成員 析構函數&#xff1a; 當對象不再被引用的時候&#xff0c;就會被垃圾回收器gc&#xff0c;回收。而收回的過程當中&#xff0c;如果需要做什么事情&#xff0c;就放在…

遠程調用--Http Interface

遠程調用--Http Interface 前言1、導入依賴2、定義接口3 創建代理&測試4、創建成配置變量 前言 這個功能是spring boot6提供的新功能&#xff0c;spring允許我們通過自定義接口的方式&#xff0c;給任意位置發送http請求&#xff0c;實現遠程調用&#xff0c;可以用來簡化…

已解決org.springframework.dao.DataRetrievalFailureException數據檢索失敗異常的正確解決方法,親測有效!!!

已解決org.springframework.dao.DataRetrievalFailureException數據檢索失敗異常的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 總結 在使用Spring Framework進行數據庫操作時&…

關于硅金屬電阻器?

EAK金屬硅電阻器類似于陶瓷復合電阻器&#xff0c;在脈沖負載方面具有優勢&#xff0c;需要高峰值功率或高電壓與低電感&#xff08;如預充電電路&#xff09;的組合。硅金屬電阻器具有更高的連續額定溫度&#xff0c;為 350C&#xff0c;而陶瓷電阻器為 250C。這種擴展的溫度范…

[藍橋杯 2023 省 B] 冶煉金屬

P9240 [藍橋杯 2023 省 B] 冶煉金屬 - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) 參考題解&#xff1a; #C3150——藍橋杯2023年第十四屆省賽真題-冶煉金屬(分塊)-Dotcpp編程社區 https://www.bilibili.com/video/BV1wc411x7KU/?spm_id_from333.1007.top_right_bar_windo…

RT-Thread操作系統 串口DMA接收時數據被拆分多包

一、問題現象 在使用RT Thread操作系統&#xff0c;串口DMA接收數據時&#xff0c;通過log打印發現&#xff0c;例如GPS NEMA數據一包數據量較大或者時&#xff0c;接收到的數據被拆分多包處理&#xff1b; 二、問題解決方案 修改DMA驅動程序 在drivers/drv_usart.c中屏蔽如…