一天一大 lee(重新安排行程)难度:中等-Day20200827
时间:2022-07-25
本文章向大家介绍一天一大 lee(重新安排行程)难度:中等-Day20200827,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:[1]
给定一个机票的字符串二维数组 [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"]。但是它自然排序更大更靠后。
抛砖引玉
抛砖引玉
思路
- 数组 tickets,索引:0->起点,1->终点
- 遍历数组 tickets,如果两个子集起点终点相等则说明两个子集连续,可以拼接起来
- 要求每个 tickets 的子集都需要有节点被拼接到结果数组中
- 如果同一个终点对应多个起点按照起点字母排序拼接
实现
- 遍历 tickets 生成 map,起点作为 map 的哈希:此时涉及重复起点的问题,题目要求按照字符大小排序,则 map 的 value 存放:到达的集合
- 从指定起点开始一直查询起点对应的终点,直到无对应终点结束
在枚举路线时,开始的思路是根据起点查到其对应的终点,从前向后遍历这些可能的终点,遇到终点不能作为其他子集起点则跳过最后拼接。
这种思路实现后会发现有些情况会使 tickets 的子集部分不被拼接(及 map 的 value 不能被清空):
- 遍历 map 的 value 时存在元素不连接其他起点
- 一个终点对应多个起点时选中当前排序小的起点,时也存在后续节点不被连接的情况
枚举路线的逻辑:
- 递归到 map 的 value 为空时开始反向(从后向前填充)
- 枚举多个起点递归,只保留可以递归到 map 的 value 为空的情况
递归
终点查询的逻辑借助递归完成
- 参数:起点 start
- 终止条件:map 中无对应起点
- 递归到 map 的 value 为空时开始反向(从后向前填充)
/**
* @param {string[][]} tickets
* @return {string[]}
*/
var findItinerary = function (tickets) {
let _result = [],
len = tickets.length,
map = new Map()
for (let i = 0; i < len; i++) {
if (map.has(tickets[i][0])) {
let items = map.get(tickets[i][0])
items.push(tickets[i][1])
items.sort()
map.set(tickets[i][0], items)
} else {
map.set(tickets[i][0], [tickets[i][1]])
}
}
function getEnd(start) {
let items = map.get(start)
// 枚举 选择传入节点对应的终点
while (items && items.length) {
getEnd(items.shift())
}
// 优先从map-value遍历完成的节点存放
_result.unshift(start)
}
getEnd('JFK')
return _result
}
- 枚举多个起点递归,只保留可以递归到 map 的 value 为空的情况
/**
* @param {string[][]} tickets
* @return {string[]}
*/
var findItinerary = function (tickets) {
let _result = ['JFK'],
len = tickets.length,
map = new Map()
for (let i = 0; i < len; i++) {
if (map.has(tickets[i][0])) {
let items = map.get(tickets[i][0])
items.push(tickets[i][1])
items.sort()
map.set(tickets[i][0], items)
} else {
map.set(tickets[i][0], [tickets[i][1]])
}
}
function getEnd(start, step) {
// 满足能每个子元素都拼接到
if (step === len) return true
let items = map.get(start) || []
// 不存在与当前起点连接的终点
if (items.length === 0) return false
for (let i = 0; i < items.length; i++) {
let item = items[i]
// 一个起点对应多个终点时,如果选择当前起点
items.splice(i, 1)
_result.push(item)
// 检查是否能 - 满足能每个子元素都拼接到
if (getEnd(item, step + 1)) {
return true
} else {
// 如果不满足此时还不能选择这个点与当前起点连接
items.splice(i, 0, item)
_result.pop()
}
}
}
getEnd('JFK', 0)
return _result
}
[1]
题目:: https://leetcode-cn.com/problems/reconstruct-itinerary//
- Hbase 学习(十一)使用hive往hbase当中导入数据
- WF追忆
- OpenCV和SVM分类器在自动驾驶中的车辆检测
- Hive Tunning(三) 最佳实践
- ambari删除脚本
- sqoop 常用命令整理(一)
- hbase 学习(十三)集群间备份原理
- hbase 学习(十二)非mapreduce生成Hfile,然后导入hbase当中
- RavenDb学习(六)查询补充特性
- hbase源码系列(一)Balancer 负载均衡
- OpenCV在车道线查找中的使用
- hbase源码系列(十五)终结篇&Scan续集-->如何查询出来下一个KeyValue
- mac系统下安装、启动、停止mongodb
- 100个Numpy练习【1】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法