力扣第332题 重新安排行程 c++ 难

news2024/10/7 17:35:26

题目

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
  • fromi.length == 3
  • toi.length == 3
  • fromi 和 toi 由大写英文字母组成
  • fromi != toi

思路和解题方法

  1. 定义了一个私有方法 backtracking,用于进行航班路线的搜索。其中 ticketNum 表示航班票数,result 是当前已经搜索到的路径。在搜索过程中,如果找到了一条合法的路径,直接返回 true 结束搜索。
  2. 在搜索时,首先从 result 中最后一个机场出发,查找所有可以到达的目的地。这里采用了一个键值对嵌套的方式进行记录,其中外层的键为出发机场,内层的键为到达机场,内层的值为该机场之间可用的航班次数。因此,可以通过 targets[result[result.size() - 1]] 查找到当前机场可以到达的所有目的地,并且记录了对应的航班次数。
  3. 然后遍历所有可以到达的目的地,如果当前目的地没有被访问过(即其航班次数大于0),则将其加入到 result 中,并将该航班次数减1。同时,递归调用 backtracking 进行下一步的搜索。如果找到了合法的路径,则直接返回 true。如果当前路径不是合法的路径,则进行回溯操作,将当前目的地从 result 中移除,并将其航班次数加1,以便在后续的搜索中重新选择该目的地。
  4. 最终,在主函数 findItinerary 中,首先进行了初始化操作,清空键值对列表 targets 并记录映射关系。然后从起始机场 "JFK" 开始进行搜索,调用 backtracking 函数,直至找到一条合法的路径。最后返回最终的结果。

复杂度

        时间复杂度:

                O(N * N^N)

时间复杂度:

  • 首先,对于构建映射关系的循环操作,需要遍历全部的航班票数量,因此时间复杂度为 O(N),其中 N 是航班票的数量。
  • 其次,在 backtracking 方法中,遍历所有可以到达的目的地,每个目的地都可能进行递归调用,最多进行 N 次递归。因此,在整个搜索过程中,每个节点的扩展次数加起来约为 N,所以时间复杂度为 O(N^N)。 综合起来,整体的时间复杂度为 O(N * N^N)。

        空间复杂度

                O(N)

空间复杂度:

  • 首先,使用了一个哈希表 targets 来存储航班的映射关系,其中需要记录出发机场、到达机场和航班次数。因此,该哈希表所占用的空间为 O(N),其中 N 是航班票的数量。
  • 其次,在递归调用 backtracking 过程中,需要维护一个路径 result,其长度不会超过航班票数量 N。因此,路径所占用的空间为 O(N)。 综合起来,整体的空间复杂度为 O(N)。

c++ 代码

class Solution {
private:
    unordered_map<string, map<string, int>> targets; // 存储出发机场和到达机场之间的航班次数

    /**
     * 回溯函数,用于生成航班路径
     * @param ticketNum 总的航班数量
     * @param result 当前正在生成的航班路径
     * @return 是否成功找到完整的航班路径
     */
    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:
    /**
     * 寻找符合条件的航班路径
     * @param tickets 给定的航班信息(包含起始机场和到达机场)
     * @return 符合条件的航班路径
     */
    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; // 返回符合条件的航班路径
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1115886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通达信神奇九转指标原理及选股公式,无未来函数,数字不消失

神奇九转指标的原理源自技术分析师汤姆迪马克(Tom Demark)发明的TD序列&#xff0c;用于识别趋势衰竭和价格反转的时间。神奇九转指标是一种震荡指标&#xff0c;目的在于解决一些技术分析指标在趋势行情中有利可图&#xff0c;但在震荡行情中表现很差的问题。 一、神奇九转指标…

算法通关村第19关【白银】| 动态规划高频问题

1.零钱兑换 思路&#xff1a; 确定dp&#xff1a;这里是最少硬币的个数&#xff0c;不是种类 确定递推公式&#xff1a;dp[j] Math.min(dp[j],dp[j-coins[i]]1),不要当前硬币dp[j]还是保持以前的组合方法,要当前硬币dp[j-coins[i]]1 确定初始化&#xff1a;dp[0]0,其他的都…

NFT Insider112:The Sandbox聘请Apple高管担任其首席内容官,YGG 将在菲律宾举办Web3游戏峰会

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

华为eNSP配置专题-浮动路由及BFD的配置

文章目录 华为eNSP配置专题-浮动路由及BFD的配置0、参考文档1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、基本终端构成和连接2.2、基本终端配置 3、浮动路由配置3.1、浮动路由的基本配置3.2、浮动路由的负载均衡问题3.3、浮动路由的优先级调整 4、BFD的配置4.1…

YOLOv8改进实战 | 更换主干网络Backbone(四)之轻量化模型MobileNetV3

前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操作,并将它们分别作用于输入的不…

利用 Pytest Cache Fixture 实现测试结果缓存

前言 接口自动关过程中&#xff0c;经常会遇到这样一些场景&#xff0c;"请求2需要用到请求1响应的数据"&#xff0c;常见的做法&#xff0c;进行用例依赖或者将请求1的响应结果写入一个文件&#xff0c;用到的时候读取文件。当然这都不是这篇文章的重点&#xff0c…

Redis性能滑坡:哈希表碰撞的不速之客【redis第二部分】

Redis性能滑坡&#xff1a;哈希表碰撞的不速之客 前言第一部分&#xff1a;Redis哈希表简介第二部分&#xff1a;哈希表冲突原因第三部分&#xff1a;Redis哈希函数第四部分&#xff1a;哈希表冲突的性能影响第五部分&#xff1a;解决冲突策略第六部分&#xff1a;redis是如何解…

nginx常见报错及解决acme.sh给Nginx配置SSL证书

问题排查&#xff1a; nginx -t //检查配置是否正确只要返回ok就说明配置没问题。 Nginx报错Failed to restart nginx.service: Unit not found 解决方法&#xff1a; 1、在根目录下执行 vim /etc/init.d/nginx2、插入以下代码 #!/bin/sh # nginx - this script starts …

Python rich库

1. 安装 pip install rich Collecting richDownloading rich-13.6.0-py3-none-any.whl.metadata (18 kB) Collecting markdown-it-py>2.2.0 (from rich)Downloading markdown_it_py-3.0.0-py3-none-any.whl.metadata (6.9 kB) Collecting pygments<3.0.0,>2.13.0 (f…

1024程序员节,给大家送份福利

各位“爱码士”们 一年一度的1024程序员节就要到了 提前祝程序猿/媛们节日快乐 除了祝福&#xff0c;肯定少不了福利啦&#xff5e; 废话不多说&#xff0c;直接上福利 知了堂1024加油包 用心成就你的IT梦想 价值9800的程序员助梦加油包 仅需1.24元 内含1024元助学金 …

Sui成为DeFi增长的首选平台

Sui网络在过去的三个月内DeFi活动增长迅速&#xff0c;其中TVL增长了341&#xff05;&#xff0c;交易量增长了229&#xff05;。这一增长对于Sui来说是一个重要的里程碑&#xff0c;它展示了Sui为其DeFi生态中的第三方开发者提供的实用性&#xff0c;以及他们支持数百万用户进…

element-ui 以CDN 方式引入原生js开发的几个别坑 (+vue)

element-ui 以CDN 方式引入原生js开发的几个坑 最近两个月太忙了 忙的没空写文章 两个月赶出来了几个的项目 一个是雪佛兰裸眼3D的一个商品屏幕展示项目 一个是广汽云渲染的一个云看车项目 一个是奥迪中国充电桩的网页开发项目&#xff0c; 奥迪中国做个饭也是目前正在做的 不…

Linux系统编程04

进程的概念 进程&#xff08;动态&#xff09;是一个正在运行的程序&#xff08;静态&#xff09; 多道程序设计缺点&#xff1a; &#xff08;1&#xff09;缺乏隔离&#xff0c;各个程序之间可以直接访问&#xff0c;使用对方的数据 &#xff08;2&#xff09;内存使用率低&a…

正点原子嵌入式linux驱动开发——LED驱动开发

在上一篇笔记中&#xff0c;详细的讲解了字符设备驱动开发步骤&#xff0c;并且用一个虚拟的chrdevbase设备为例完成了第一个字符设备驱动的开发。本章就开始编写第一个真正的Linux字符设备驱动。在正点原子STM32MP157开发板上有一个LED灯&#xff0c;本章就学习一下如何编写Li…

探讨Unity新的收费模式:对开发者与游戏行业的影响、负面因素的解析及面对挑战的建议

本人详解 作者&#xff1a;王文峰&#xff0c;参加过 CSDN 2020年度博客之星&#xff0c;《Java王大师王天师》采购供应链共享平台人员,财务规则对账人员&#xff0c;物流门禁计量系统对接人员&#xff0c;ERP事业部人员 Unity是一款备受开发者欢迎的跨平台游戏引擎&#xff0c…

基于SSM的台球厅管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

【再识C进阶5(上)】详细介绍C语言文件操作——文件是用于存储数据

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…

成绩查询页面和自助查询方式

科技发展让我们有更多的方式来发布和查询学生成绩。今天&#xff0c;我想向大家介绍什么是成绩查询页面&#xff0c;并分享如何通过各种代码和Excel来实现让学生自助查询成绩。 成绩查询页面是一个专门用来发布和查询学生成绩的网络页面。这个页面具有发布、查询、统计成绩等功…

Vue 3使用 Iconify 作为图标库与图标离线加载的方法、 Icones 开源在线图标浏览库的使用

之前一直naive-ui搭配使用的是xicons&#xff0c;后来发现Iconify支持的图标合集更多&#xff0c;因此转而使用Iconify。 与FontAwesome不同的是&#xff0c;Iconify配合Icones相当于是一个合集&#xff0c;Iconify提供了快捷引入图标的方式&#xff0c;而Icones是一个大的图标…

二、vue基础语法

一、模板语法 1、文本渲染 使用双花括号语法插入文本 <template><div><h3>msg: {{ message }}</h3></div> </template><script> export default {data() {return {message: "输出信息"}} } </script><style s…