力扣332. 重新安排行程 Java dfs回溯

news2024/11/24 8:42:24

给你一份航线列表 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:用HashMap<String, TreeSet> 存储tickets key表示出发地点 TreeSet表示终点 并且TreeSet自动会按字典进行排序 因为每次遍历直接取的是最佳路线 所以直接取TreeSet中的第一个即可

思路1错了 按照思路1的话每次可以选择多个终点的时候 如果只默认选第一个 有可能进入的地方没有可以去的下一个地方
思路2:
所以应该每次有多个可以去的地方的时候 要用递归每个地方都尝试一下 然后如果下个地方没有机票 就中断递归
然后当所有递归完成了 可能有多个结果 因为我们用的是TreeSet 所以肯定默认选最优的那个
所以当找到了结果的时候直接终止递归返回这个结果就行 另外因为java对对象的参数传递是引用传递
所以递归的时候需要不断回溯我们的HashMap<String,TreeSet>

思路2错了 TreeSet不能保存重复值 [[“JFK”,“SFO”],[“JFK”,“SFO”],[“SFO”,“JFK”]]用例失败
思路3(通过):
应该用HashMap<String, TreeMap<String,Integer>> 这样即可以排序String 也可以记录同一个机票的剩余票数

public static void dfs(List<String> sum, Boolean[] haveFind, String startStation, HashMap<String, TreeMap<String, Integer>> map, int sumStation, int nowStation) {
    if (nowStation == sumStation) {// 已经找到结果了 并且第一个找到的就是最佳结果 结束所有递归
        haveFind[0] = true;
        return;
    }
    if (map.get(startStation) == null) return;//找不到始发站为startStation的票 这个递归失败

    TreeMap<String, Integer> treeMap = map.get(startStation);
    TreeSet<String> ss = new TreeSet<>(treeMap.keySet());//new一个keySet来遍历treeMap 防止遍历时因为修改treeMap报错
    for (String s : ss) {//遍历所有剩余的始发站为startStation的票
        sum.add(s);
        Integer left = treeMap.get(s) - 1;//表示这个出发和目的地相同的机票还有几张
        if (left == 0) treeMap.remove(s);
        else treeMap.put(s, left);
        map.put(startStation, treeMap);
        dfs(sum, haveFind, s, map, sumStation, nowStation + 1);

        if (haveFind[0]) return;//已经找到结果了 不用递归了

        //回溯
        sum.remove(sum.size() - 1);
        treeMap.put(s, left + 1);
        map.put(startStation, treeMap);
    }
}

public static List<String> findItinerary(List<List<String>> tickets) {
    HashMap<String, TreeMap<String, Integer>> map = new HashMap<>();
    for (List<String> ticket : tickets) {
        if (map.containsKey(ticket.get(0))) {
            TreeMap<String, Integer> treeMap = map.get(ticket.get(0));
            if (treeMap.containsKey(ticket.get(1))) treeMap.put(ticket.get(1), treeMap.get(ticket.get(1)) + 1);
            else treeMap.put(ticket.get(1), 1);
            map.put(ticket.get(0), treeMap);
        } else {
            TreeMap<String, Integer> treeMap = new TreeMap<>();
            treeMap.put(ticket.get(1), 1);
            map.put(ticket.get(0), treeMap);
        }
    }
    List<String> sum = new ArrayList<>();
    sum.add("JFK");
    Boolean[] haveFind = new Boolean[1];
    haveFind[0] = false;
    dfs(sum, haveFind, "JFK", map, tickets.size(), 0);
    return sum;
}

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

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

相关文章

AutoDL使用教程

AutoDl是一个租用GPU显卡的平台&#xff0c;我们可以在上面租用显卡。我训练模型的时候租用了一块V100。 下面介绍一下使用AutoDL 来租用GPU显卡&#xff0c;并将自己的代码上传&#xff0c;运行代码。 目录&#xff1a; 创建实例配置环境 pytorch环境上传文件运行代码 一、…

DAY11_RequestResponse

目录 1 Request和Response的概述2 Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式 2.3 IDEA快速创建Servlet2.4 请求参数中文乱码问题2.4.1 POST请求解决方案2.4.2 GET请求…

flutter图片添加水印

flutter为图片右下角添加上水印 //制造字符串水印图片_makeStrMarkImage(String str, double fontSize) async {final picRecorder ui.PictureRecorder();final paragraphBuilder ui.ParagraphBuilder(ui.ParagraphStyle(textAlign: TextAlign.left,fontSize: fontSize,),)…

C#winform电脑关机实例

本篇实例演示C#winform电脑关机 创建winform添加一个按钮 Cs文件代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.T…

ThreadLocal学习

1、threadLocal图解 java.lang.ThreadLocal类实现了线程的本地存储。 ThreadLocal的内部实现&#xff1a; ThreadLocal的内部实现包括一个类似HashMap的对象&#xff0c;这里称之ThreadLocalMap。 ThreadLocalMap的key会持有对ThreadLocal实例的弱引用&#xff08;Weak Refer…

Perfectly Clear Workbench for Mac/Windows(智能图像清晰度处理软件)

Perfectly Clear Workbench是一款用于图像处理和修复的软件工具&#xff0c;它提供了一套强大的功能&#xff0c;旨在自动优化照片质量并消除常见的图像缺陷。这个工作台是Perfectly Clear家族的一部分&#xff0c;由Athentech Imaging开发和维护。 Perfectly Clear Workbench…

第一章:光纤通信概述

第一节&#xff1a;通信基本概念 1.1光纤通信基本概念 1.1.1光纤通信的概念 利用光导纤维传输广播信号的通信方式称为光纤通信。光波主要包括紫外线、可见光和红外线。光纤通信工作波长在近红外区&#xff0c;0.8um~1.8um的波长区&#xff0c;频率为167THz~375THz。光纤基础…

JWT跨域认证解决方案

JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案&#xff0c;本文介绍它的原理和用法。 一、跨域认证的问题 互联网服务离不开用户认证 一般流程是&#xff1a; 1、用户向服务器发送用户名和密码 2、服务器验证通过后&#xff0c;在当前对话…

【SpringBoot】SpringBoot-Admin 服务监控 + 告警通知

简单介绍 Spring Boot Actuator 是 Spring Boot 自带的一个功能模块&#xff0c; 提供了一组已经开箱即用的生产环境下常用的特性和服务&#xff0c;比如应用程序的健康检查、信息暴露、度量收集、日志记录等。 在实际项目中&#xff0c;Actuator 可以帮助我们快速了解应用程序…

三维重建以及神经渲染中的学习(一)

三维重建以及神经渲染中的学习 公众号AI知识物语 本文内容为参加过去一次暑期课程学习时的笔记&#xff0c;浅浅记录下。 显示表征&#xff1a; 点云points&#xff1a;由一组离散三维点表征物体表面 推理速度快&#xff0c;容易获取 -离散表征&#xff0c;无拓扑关系 [Fa…

mysql的聚簇索引和非聚簇索引的区别

MySQL InnoDB存储引擎时&#xff0c;索引类型可分为聚簇索引和非聚簇索引&#xff0c;有时候也通俗的称为主键索引和普通索引。MyISAM的引擎只有非聚簇索引&#xff0c;所以MYSIAM的引擎在查询的时候非主键索引的时候特别快 接下来讨论一下几个问题&#xff1a; 什么是聚簇索…

linux搭建vsftpd服务使用filezilla连接服务

背景&#xff1a;支持使用filezilla上传文件到公司的服务机器上&#xff0c;所以搭建vsftpd支持filezilla进行上传 一、linux机器搭建vsftpd服务 1、先看看自己的机器属于什么发行版&#xff0c;不同的发行版命令不一样 我的是centos&#xff0c;其他发行版命令不一样&#xf…

架构训练营笔记:高可用设计

2-3高可用设计 高可用复杂度模型 分为计算高可用&#xff0c;存储高可用&#xff0c;高可用本质上需要冗余&#xff0c;这里是集群&#xff0c;没有单机。 计算高可用&#xff1a;分为任务分配与任务分解。 计算高可用对比之前的高性能&#xff0c;就是多了状态检测。 任务…

请求响应-实体参数的接受

实体参数的接受 简单实体对象&#xff1a;请求参数名与形参属性对象名相同&#xff0c;定义pojo接受即可&#xff0c;将数据封装到实体类中实体类代码如下&#xff1a; package com.example.POJO;public class User {private String name;private Integer age;public String g…

系统测试——postman的400错误

如果Headers中不勾选Host&#xff0c;调用接口就会报400 Bad Request错误。

Hystrix 断路器

文章目录 1 问题&#xff1a;服务雪崩2 概念3 服务降级3.1 概念&#xff1a;3.2 触发服务降级的情况&#xff1a;3.3 应用3.3.1 依赖3.3.2 解决的问题3.3.3 生产者&#xff1a;3.3.4 消费者&#xff1a;3.3.5 配置全局fallback方法3.3.6 解耦合 4 服务熔断4.1 概念&#xff1a;…

Shell的条件运算语句

目录 IF语句 单分支语句语法语法 多分支结构语法 CASE语句 语法 IF语句 单分支语句语法语法 #写法1 if 条件语句 then内容 fi#写法2 if 条件语句 ;then内容 fi编写一个内容警报器的例子 #!/bin/bash free_mem$(free -m | grep "Mem:" | tr -s " "…

kubernetes源码学习之kube-scheduler

kube-scheduler是kubernetes中的调度程序&#xff0c;负责从api server中获得待分发的pod列表&#xff0c;并为他们找到最合适运行的Node。 基于kubernetes 1.27 基本框架 下面是kubernetes官发给出的框架图&#xff0c;先对kubernetes pod调度的大致流程有一个认识 看一下有…

眼睛:来一场视觉盛宴《手拿把掐》css特效 —— 之听说过CSS【笑】

&#x1f637;&#x1f60a;&#x1f93a;&#x1f93a;&#x1f93a;前期回顾 打造极简风格动效 —— 5 分钟轻松实现惊艳、震撼人心的视觉效果_彩色之外的博客-CSDN博客 &#x1f601; css动画 —— 把你喜欢css动画嵌入到浏览器中_css做的动画效果怎么嵌入网页_彩色之外的…

window电脑修复网络不能正常

问题描述 问题的起点是我打开了OpenAPI公司的GPT&#xff0c;在回答的过程中响应很慢&#xff0c;然后自己开始尝试切换连接的服务器&#xff08;这里使用到了网络代理&#xff09;&#xff0c;最后自己做了一个操作是 代理软件的这个菜单里面的增强模式选项&#xff0c;结果…