有向图问题,一开始考虑用bfs, 但是因为path有可能会走到dead end,所以bfs并不适合。dfs的探路方式是一条道走到底,如果发现是dead end,则试下一条路。 这道题还要求我们输入lexical order尽可能小的路径。所以我们对neighbor节点要进行排序。

  • 构造adjacent map
  • 对每个value array进行排序
  • dfs遍历,注意对value array 里的每一个值, 要先弹出,再恢复
var findItinerary = function(tickets) {
    const len = tickets.length;
    if (len === 0) {
        return [];
    }

    const map = {};
    for (let ticket of tickets) {
        if (ticket[0] in map) {
            map[ticket[0]].push(ticket[1]);
        } else {
            map[ticket[0]] = [ticket[1]];
        }
    }
    for (let key in map) {
        map[key].sort();
    }
    const curr = ['JFK'];
    const res = [];
    dfs(map, tickets.length + 1, curr, res);
    return res[0];
};

function dfs(map, city, routeLength, curr, res) {
    const city = curr[curr.length - 1];
    if (curr.length === routeLength) {
        res.push([...curr]);
        return true;
    }

    const neighbors = map[city];
    if (!neighbors) {
        return false;
    }
    for (let i = 0; i < neighbors.length; i++) {
        const neighbor = neighbors[i];
        neighbors.splice(i, 1);
        curr.push(neighbor);
        if (dfs(map, routeLength, curr, res)) {
            return true;
        }
        curr.pop();
        neighbors.splice(i, 0, neighbor);
    }
}

results matching ""

    No results matching ""