【做一道算一道】力扣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

vec0vec1对应上面表格的出发机场和到达机场

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"开始,逐个优先按字典序查找可行的航班路径。

相关推荐
Tisfy9 分钟前
LeetCode 2685.统计完全连通分量的数量:DFS求每个连通块的边点数
算法·leetcode·深度优先··题解·连通图·全连通分量
海石19 分钟前
1次遍历,空间复杂度击败100%,时间复杂度击败85%
算法·leetcode
L歪歪君1 小时前
Apache Doris全链路性能优化实战指南:从架构设计到生产落地
java·开发语言·算法
m0_466525291 小时前
从“算法内卷”到“可信易用” 东软多模态医学人工智能平台开启无代码科研新时代
人工智能·算法
码少女1 小时前
数据结构——冒泡排序及优化
数据结构·算法·排序算法
tyqtyq221 小时前
营养餐单规划:AI 科学饮食规划系统的鸿蒙实现
人工智能·学习·华为·职场和发展·生活·harmonyos
梦回江东2 小时前
ansible中的主机清单
算法
青梅橘子皮2 小时前
string---入门OJ题(1)
数据结构·算法
qq_454245032 小时前
BasicMethod.Map 设计框架:8 个并行基础模块的数学根基与实现
数据结构·算法·c#
青山木2 小时前
Hot 100 --- 二叉树与递归
java·数据结构·算法·leetcode·深度优先