【算法30天:Day30】第七章回溯算法 LeetCode 重新安排行程(332)

80 阅读1分钟

题目一:

image.png

直接看代码:

var findItinerary = function(tickets) {
    let result = ['JFK'] // 记录起始机场
    let map =  {} || new Map()
    for (const ticket of tickets) { // 记录映射关系
        const [from, to] = ticket // ES6 解构赋值
        if (map[from] === undefined) {
            map[from] = [] // 如果map中不存在当前起始机场,变将其value设置为空数组,以便以后添加映射机场
        }
        map[from].push(to) // 一个机场映射多个机场,key值为出发机场,其value为降落机场数组
    }
    for (const city in map) {
        map[city].sort() // 对到达城市列表排序,对每个出发机场对应的降落机场数组进行排序
    }
    var backtracking = () => {
        if (result.length === tickets.length + 1) {
            return true
        }
        if (map[result[result.length - 1]] === undefined || map[result[result.length - 1]].length === 0) {
            return false
        }
        for (let i = 0; i < map[result[result.length - 1]].length; i++) {
            let city = map[result[result.length - 1]][i] // 获取获取当前出发机场对应的排序后的第一个降落机场
            map[result[result.length - 1]].splice(i, 1) // 删除已走过航线,防止死循环
            result.push(city)
            if (backtracking()) {
                return true
            }
            result.pop(city)
            map[result[result.length - 1]].splice(i, 0, city) // 将删除的航线,重新添加进去,回溯
        }
    }
    backtracking()
    return result
};

总结

这道题主要学习一下如何使用map建立这样复杂的映射关系,逻辑更加清晰了。