刷题day51:重新安排行程 ***

2023-10-27

题意描述:

给你一份航线列表 tickets ,其中 tickets[i] = [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。

所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始。如果存在多种有效的行程,请你按字典排序返回最小的行程组合。

例如,行程 ["JFK", "LGA"] 与 ["JFK", "LGB"] 相比就更小,排序更靠前。
假定所有机票至少存在一种合理的行程。且所有的机票 必须都用一次 且 只能用一次。

 难点:

  1. 一个行程中,如果航班处理不好容易变成一个圈,成为死循环
  2. 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ?
  3. 使用回溯法(也可以说深搜) 的话,那么终止条件是什么呢?
  4. 搜索的过程中,如何遍历一个机场所对应的所有机场。

对于字母排序的问题,使用map进行即可,因为map将元素放进去之后就会自动进行排序,使用unordered_map<string, map<string, int>> targets:

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

这种方式定义,因为使用过的机场要进行删除元素处理,用set的话不能删除元素,一旦删除元素,迭代器就失效了。

在遍历 unordered_map<出发机场, map<到达机场, 航班次数>> targets的过程中,可以使用"航班次数"这个字段的数字做相应的增减,来标记到达机场是否使用过了。相当于不删除,只是做一个标记。

完整的C++代码如下:

class Solution {
private:
// unordered_map<出发机场, map<到达机场, 航班次数>> targets
unordered_map<string, map<string, int>> targets;
bool backtracking(int ticketNum, vector<string>& result) {
    if (result.size() == ticketNum + 1) {
        return true;
    }
    for (pair<const string, int>& target : targets[result[result.size() - 1]]) {
        if (target.second > 0 ) { // 记录到达机场是否飞过了
            result.push_back(target.first);
            target.second--;
            if (backtracking(ticketNum, result)) return true;
            result.pop_back();
            target.second++;
        }
    }
    return false;
}
public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        targets.clear();
        vector<string> result;
        for (const vector<string>& vec : tickets) {
            targets[vec[0]][vec[1]]++; // 记录映射关系
        }
        result.push_back("JFK"); // 起始机场
        backtracking(tickets.size(), result);
        return result;
    }
};

其中对几行代码进行解释:

targets[vec[0]][vec[1]]++; 其中vec[0] (取vec[0]的value)为targets的‘string’ 部分,也就是起始机场,vec[1] 为targets的第二个map部分,然后++就对应第二个map里面的int++,就是航班次数加一。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

刷题day51:重新安排行程 *** 的相关文章

随机推荐

  • flutter开发实战-实现marquee根据文本长度显示文本跑马灯效果

    flutter开发实战 实现marquee文本跑马灯效果 最近开发过程中需要marquee文本跑马灯效果 这里使用到了flutter的插件marquee 效果图如下 一 marquee 1 1 引入marquee 在pubspec yaml
  • 第一课:VxWorks系统概述

    目录 1 1 VxWorks系统简介 1 2 VxWorks的特点 1 3VxWorks系统和Linux系统的区别 1 4 VxWorks开发环境获取 1 1 VxWorks系统简介 VxWorks 操作系统是美国WindRiver公司于1
  • matlab中如何对一个小数取整,学习笔记153—matlab中小数如何取整?

    matlab中小数取整的函数大约有四个 floor ceil round fix 1 round取整方法是四舍五入 round函数功能 四舍五入取整 使用方法 B round A 对数组A中每个元素朝最近的方向取整数部分 并返回与A同维的整
  • 在微信小程序中如何使用wx.onLocationChange(function callback)

    参考文档 点这里 其实我使用这个挨批之前用的是wx getLocation文档点这里 可是很无奈 产品的需求是要从首页点进去的时候获取一次用户坐标 可是如果用户频繁点击在真机上就会出现获取不到的情况 会报以下的错误 如下图所示 所以很尴尬
  • 【python基础】【pandas】读取数据pd.read_csv、列表切片iloc、转换成数组to_numpy

    读取数据保存到data中 路径根据你保存的train csv位置而有变化 big5 是专门针对台湾繁体的 data pd read csv D pycharm HungYiLiData hw1 train csv encoding utf
  • 递归的方法对字符串逆序

    对于字符串逆序 简单的说就是把字符串倒过来 比如说 abcdef 将它逆序后就变成 fedcba 这看起来是多么的简单易懂 但是一旦放到代码中 思维可就要加强十倍了 include
  • 分配学号python

    with open studentList csv mode r encoding utf 8 as stuData lsStu line strip split for line in stuData with open schoolCo
  • 【100%通过率 】【华为OD机试 c++/python】猜字谜【 2023 Q1

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 小王设计了一个简单的猜字谜游戏 游戏的谜面是一个错误的单词 比如nesw 玩家需要猜出谜底库中正确的单词 猜中的要求如下 对于某个谜面和谜底单词
  • 零日漏洞

    点击上方 订阅话题 第一时间了解漏洞威胁 0x01 漏洞描述 Windows Print Spooler是Windows的打印机后台处理程序 广泛的应用于各种内网中 360漏洞云监测到微软最新披露了一个新的Windows Print Spo
  • 解决C++调用python传递中文路径的问题

    背景 最近在做使用C 调用python代码来进行图像处理 需要传入一个图像文件的路径 使用 char picPath E pic jpg PyObject path Py BuildValue s picPath 来生成图像路径的pytho
  • PAT 1072 开学寄语(20)(代码+思路)

    1072 开学寄语 20 分 下图是上海某校的新学期开学寄语 天将降大任于斯人也 必先删其微博 卸其 QQ 封其电脑 夺其手机 收其 ipad 断其 wifi 使其百无聊赖 然后 净面 理发 整衣 然后思过 读书 锻炼 明智 开悟 精进 而
  • python监视mysql最大连接数

    usr local bin python3 5import pymysqlimport time sum 0 while True open db connection db pymysql connect localhost root a
  • You can‘t specify target table ‘XXXX‘ for update in FROM clause mysql错误解决方法

    mysql数据库同时对一个表进行查询和删改操作时 会报 You can t specify target table XXXX for update in FROM clause 错误 无法执行 错误提示的意思是 不能在 FROM 子句中指
  • 2022年度回顾

    2022年接近尾声 驻足回看行业这一年的跌宕起伏 无论是技术的突破 应用的创新 还是生态的兴衰 皆成为了行业发展的历史注脚 如往年一样 万向区块链于年末推出重磅年度回顾系列文章 公链技术篇 应用篇 和 监管篇 以期记录当前行业发展的缩影 下
  • Java快捷键(学到会慢慢更新)

    大家都知道快捷键的重要性 尤其在代码中 懂得运用快捷键的小伙伴写代码速度就是快 目前我学Java还不是很久 之前学c的 所以所知道的快捷键比较少 后续会一直更新这条博文 第一个快捷键 psvm 回车 这是main函数快速生成快捷键 具体还是
  • 顺序表的基本操作

    目录 一 实验要求 二 代码实现 三 运行结果 一 实验要求 1 验证性实验 实现顺序表的基本操作 实验内容 编写一个程序sqlist cpp 或 c 实现顺序表的各种基本运算和整体建表算法 假设顺序表的内容类型ElemType为char
  • Git-常用命令

    系列文章 Git 入门小结 Git 分支 Git 常用命令 Git 注册远程仓库 1 提交代码到暂存区 git add 添加当前目录的所有文件到缓存区 git add file1 file2 添加指定文件到缓存区 git rm file1
  • 1分钟学会在C++中将图像转换为Word文档,快速入手光学字符处理控件Aspose.OCR

    图像和扫描的文档可能包含您可能需要进一步处理的文本信息 可能已经使用智能手机拍摄了文本文档的图片 并将其转换为可编辑的文档 为此 对图像执行 OCR 可以证明是有帮助的 使用 OCR 可以将图像转换为可搜索和可编辑的 Word 文档 为此
  • c 语言软链接函数,C++/C链接过程详解

    头文件可以被多个编译单元包含 如果头文件里有定义 那么每个包含这个头文件的编译单元就都会对同一个符号 进行定义 如果该符号为外部链接 则会导致duplicated external simbols 因此如果头文件里要定义 必须保证定义的符号
  • 刷题day51:重新安排行程 ***

    题意描述 给你一份航线列表 tickets 其中 tickets i fromi toi 表示飞机出发和降落的机场地点 请你对该行程进行重新规划排序 所有这些机票都属于一个从 JFK 肯尼迪国际机场 出发的先生 所以该行程必须从 JFK 开