【做一道算一道】力扣332.重新安排行程

332.重新安排行程

给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 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"]。但是它自然排序更大更靠后。

思路

代码随想录 332.重新安排行程

做不了一点,跟着代码随想录刷的,这个题感觉用到了好多东西,记一下。

特别里面的嵌套结构,看的有点绕,记一下理解的结果。

代码

cpp 复制代码
class Solution {
private:
    //                               unordered_map<string, map<string, int>> targets:
    //出发机场->{到达机场->航班次数}  unordered_map<出发机场, map<到达机场, 航班次数>> targets
    unordered_map<string,map<string,int>> targets;
    vector<string> res;
    bool backtracking(int ticketNum,vector<string>& res){
        if(res.size()==ticketNum+1){  //类似插缝,机场数比航班数多一
            return true;
        }
        for(pair<const string,int>& target:targets[res[res.size()-1]]){
            if(target.second>0){ //还能飞
                res.push_back(target.first);
                target.second--;
                if(backtracking(ticketNum,res))
                return ture;
                res.pop_back();
                target.second++;
            }
        }
        return false;
    }
public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        //tickets结构=[[出发机场,到达机场]]
        //tickets = [["string","string"]]
        for(const vector<string>& vec:tickets){
            targets[vec[0]][vec[1]]++;  //int类型的默认初始化是0
        }
        res.push_back("JFK");
        backtracking(tickets.size(),res);
        return res;
    }
};

理解

unordered_map<出发机场, map<到达机场, 航班次数>> targets

内层选map使得到达机场(key)是有序的,最终的结构符合字典序

unordered_map<string, map<string, int>> targets的结构理解:

设tickets={

["JFK", "LAX"],

["JFK", "SFO"],

["LAX", "SFO"],

["JFK", "LAX"]

}

则,targets = {

"JFK" => {

"LAX" => 2,

"SFO" => 1

},

"LAX" => {

"SFO" => 1

}

}

即这个最里面的map是到达机场是键(key),航班次数是值(value),然后这一对key-value又是外层unordered_map的value,key是出发机场,这样的一个两层嵌套结构。

假如用表格表示的话大概如下表(直观表示,实际是嵌套关系):

出发机场 到达机场 航班次数
JFK LAX 2
JFK SFO 1
LAX SFO 3
cpp 复制代码
for(const vector<string>& vec:tickets){
            targets[vec[0]][vec[1]]++;  //int类型的默认初始化是0
        }

targets没有初始化的情况下,int类型默认值为0

vec[0]vec[1]对应上面表格的出发机场和到达机场

cpp 复制代码
res.push_back("JFK");
cpp 复制代码
       for(pair<const string,int>& target:targets[res[res.size()-1]]){
            if(target.second>0){ //还能飞
                res.push_back(target.first);
                target.second--;
                if(backtracking(ticketNum,res))
                return ture;
                res.pop_back();
                target.second++;
            }
        }

因为res在函数中初始化了以"JFK"为初值(题意,"JFK"为起始机场),所以一开始在已经初始化了的targets中查找航班次数就从"JFK"开始,逐个优先按字典序查找可行的航班路径。

相关推荐
肥猪猪爸1 小时前
使用卡尔曼滤波器估计pybullet中的机器人位置
数据结构·人工智能·python·算法·机器人·卡尔曼滤波·pybullet
readmancynn1 小时前
二分基本实现
数据结构·算法
萝卜兽编程1 小时前
优先级队列
c++·算法
盼海2 小时前
排序算法(四)--快速排序
数据结构·算法·排序算法
一直学习永不止步2 小时前
LeetCode题练习与总结:最长回文串--409
java·数据结构·算法·leetcode·字符串·贪心·哈希表
Rstln2 小时前
【DP】个人练习-Leetcode-2019. The Score of Students Solving Math Expression
算法·leetcode·职场和发展
芜湖_3 小时前
【山大909算法题】2014-T1
算法·c·单链表
珹洺3 小时前
C语言数据结构——详细讲解 双链表
c语言·开发语言·网络·数据结构·c++·算法·leetcode
几窗花鸢3 小时前
力扣面试经典 150(下)
数据结构·c++·算法·leetcode
.Cnn3 小时前
用邻接矩阵实现图的深度优先遍历
c语言·数据结构·算法·深度优先·图论