【做一道算一道】力扣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"开始,逐个优先按字典序查找可行的航班路径。

相关推荐
Ai多利几秒前
深度学习登上Nature子刊!特征选择创新思路
人工智能·算法·计算机视觉·多模态·特征选择
蒟蒻小袁39 分钟前
力扣面试150题--被围绕的区域
leetcode·面试·深度优先
Q8137574601 小时前
中阳视角下的资产配置趋势分析与算法支持
算法
yvestine1 小时前
自然语言处理——文本表示
人工智能·python·算法·自然语言处理·文本表示
GalaxyPokemon2 小时前
LeetCode - 148. 排序链表
linux·算法·leetcode
iceslime2 小时前
旅行商问题(TSP)的 C++ 动态规划解法教学攻略
数据结构·c++·算法·算法设计与分析
aichitang20243 小时前
矩阵详解:从基础概念到实际应用
线性代数·算法·矩阵
OpenCSG4 小时前
电子行业AI赋能软件开发经典案例——某金融软件公司
人工智能·算法·金融·开源
chao_7894 小时前
链表题解——环形链表 II【LeetCode】
数据结构·leetcode·链表
dfsj660114 小时前
LLMs 系列科普文(14)
人工智能·深度学习·算法