• leetcode 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
    • fromitoi 由大写英文字母组成
    • fromi != toi

     Java程序(回溯):

    1. class Solution {
    2. private Deque res;
    3. // 参数:出发机场,到达机场,航班次数
    4. private Map> map;
    5. private boolean backTracking(int ticketNum){
    6. if(res.size() == ticketNum + 1){
    7. // res存放的是出发地->目的地,ticketNum可以认为是从出发地到目的地的机票数量
    8. // 抽象来说就是res存放的是点,ticketNum是过程,所以res的数量比ticketNum大1
    9. return true;
    10. }
    11. // 获取本次行程的起点(出发地)[也就是上一次行程的目的地]
    12. String last = res.getLast();
    13. if(map.containsKey(last)){//防止出现null
    14. for(Map.Entry target : map.get(last).entrySet()){
    15. // 获取当前可以到达目的机场的航班数量
    16. int count = target.getValue();
    17. if(count > 0){ // 大于零,表示还有航班可以达到该目的机场
    18. res.add(target.getKey());
    19. target.setValue(count - 1);
    20. // 选择本次航班,并进入下一次行程
    21. if(backTracking(ticketNum)) return true; // 所有的机票都使用完,则直接返回结果
    22. // 本次行程无法满足要求,回溯
    23. res.removeLast();
    24. target.setValue(count);
    25. }
    26. // count = 0,表示已经没有可以到达该目的机场的航班了(之前已经坐过)
    27. }
    28. }
    29. return false;
    30. }
    31. public List findItinerary(List> tickets) {
    32. map = new HashMap>();
    33. res = new LinkedList<>();
    34. // 记录映射关系
    35. for(List t : tickets){
    36. // temp表示 <目的机场,达到目的机场的航班次数>
    37. Map temp;
    38. if(map.containsKey(t.get(0))){
    39. // 发现该出发机场已经存在
    40. temp = map.get(t.get(0));
    41. // 给该出发机场添加新的目的(降落)机场,更新到达目的机场的航班次数
    42. temp.put(t.get(1), temp.getOrDefault(t.get(1), 0) + 1);
    43. }else{
    44. // 映射关系中初次发现出发机场,初始化达到目的机场的航班次数
    45. temp = new TreeMap<>();//升序Map
    46. temp.put(t.get(1), 1);
    47. }
    48. // 存入出发机场 -> 目的机场的映射
    49. map.put(t.get(0), temp);
    50. }
    51. // 添加本次行程的起点
    52. res.add("JFK");
    53. backTracking(tickets.size());
    54. return new ArrayList<>(res);
    55. }
    56. }
  • 相关阅读:
    shadertoy-安装和使用
    故障分析 | MySQL锁等待超时一例分析
    SyntaxError: EOL while scanning string literal
    45.【Java 实现双色球中奖查询系统】
    001. 组合
    【毕业设计源码】PHP高校兼职跑腿系统
    C++深度解析教程 - 目录
    docker安装redis
    K8S入门前奏之VMware虚拟机网络配置
    NLP(2)--Transformer
  • 原文地址:https://blog.csdn.net/kt1776133839/article/details/128194814