回溯-重新安排行程

 

class Solution {
private:
    // unordered_map<出发城市, map<到达城市, 航班次数>> targets
    //其中航班次数是用来判断这个机场是否使用过,用来避免循环
    unordered_map<string, map<string, int>> targets;
    // 用bool类型是因为答案只需要一个结果
    bool backTracking(int ticketNum, vector<string>& res) {
        // ticketNum是用来进行终止的
        if (res.size() == ticketNum + 1) {
            return true;
        }
        //核心for循环
        // 将上一层的到达城市,作为这一次的出发城市,利用pair来记录出发城市所能到达的城市
        for (pair<const string, int>& target : targets[res[res.size() - 1]]) {
            // 大于0说明没来过这个机场
            if (target.second > 0) {
                res.push_back(target.first);
                target.second--;
                if (backTracking(ticketNum, res)) return true;
                res.pop_back();
                target.second++;
            }
        }
        return false;
    }

public:
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        vector<string> res;
        // 初始化targets
        for (const vector<string>& vec : tickets) {
            targets[vec[0]][vec[1]]++;
        }
        // 初始化res
        res.push_back("JFK");
        backTracking(tickets.size(), res);
        return res;
    }
};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值