leetcode 332重新安排行程

简介: leetcode 332重新安排行程

重新安排行程

279e99ee3ca146dd9aa5cf0860f6793d.png

回溯遍历(超时)

回溯遍历每一种可能

当出现第一种可能的路线,之间加入。

当出现新的可能路线,与老路线对比,如果字典排序小于,则替换老路线

class Solution {
public:
    vector<string> resul;
    vector<string> path;
    void backtraking(vector<vector<string>>& tickets , string Indnx ,  vector<bool> &used)
    {
      //找到路线,看是否替换老的路径
      //如果没有老路径直接加入,如果相同就返回,如果不同路径按照字典比较
        if(path.size()==tickets.size()+1)
        {
            if(resul.empty()==1) 
            {
                resul = path;
                return;
            }
            else if(resul == path) return;
            else 
            {
                for(int j=0 ;j<path.size();j++)
                {
                    for(int k=0 ;k<3;k++)
                    {
                        if(resul[j][k] == path[j][k]) continue;
                        else if(resul[j][k] < path[j][k])return;
                        else if(resul[j][k] > path[j][k]) 
                        {
                            resul.clear();
                            resul = path;
                            return;
                        }
                    }
                }
            }
            // cout<<"resu: ";
            // for(auto i:resul) cout<<i<<' ';
            // cout<<endl;
            return;
        }
        for(int i=0 ; i<tickets.size();i++)
        {
          //如果当前机票使用过,或者当前机票目的地不对,跳过
            if(used[i]==true || tickets[i][0] != Indnx) continue;
            //如果当前机票可用,则加入路径
            if(used[i]== false && tickets[i][0] == Indnx)
            {
                used[i] = true;
                path.push_back(tickets[i][1]);
                //递归,确定递归找的新机票。下一站机票的开始机场,就是当前机票的目的地机场
                backtraking(tickets,tickets[i][1],used);
                used[i] = false;
                path.pop_back();
            }
        }
        return;
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        vector<bool> used(tickets.size(),false);
        path.push_back("JFK");
        backtraking(tickets,"JFK",used);
        return resul;
    }
};

排序再回溯

先对输入票排序,其中排序按照票的目的地的字典减少排序(因为出发点是确定的,目的地多种找最优解)

之后回溯遍历找路线,发现的第一个路线即为最优路线

class Solution {
public:
  //按飞机票目的地(字符串vector第二个参数)字典减小排序
     class compare
    {
    public:
        bool operator()( const vector<string> tickets1 ,const  vector<string> tickets2 )
        {
            if((tickets1[1])[0]  < (tickets2[1])[0]) return 1;
            else if((tickets1[1])[0]  == (tickets2[1])[0])
            {
                if((tickets1[1])[1]  < (tickets2[1])[1]) return 1;
                else if((tickets1[1])[1]  == (tickets2[1])[1])
                {
                    if((tickets1[1])[2]  < (tickets2[1])[2]) return 1;
                    else return 0;
                }
                 return 0;
            }
            return 0;
        }
    };
    vector<string> resul;
    vector<string> path;
    bool find = false;
    void backtraking(vector<vector<string>>& tickets , string Indnx ,  vector<bool> &used)
    {
      //找到一个路径就不找了,直接是最优路径
        if(find == true ) return;
        if(path.size()==tickets.size()+1)
        {
                resul = path;
                find =true;
                return;
        }
        for(int i=0 ; i<tickets.size();i++)
        {
            if(used[i]==true || tickets[i][0] != Indnx) continue;
            if(used[i]== false && tickets[i][0] == Indnx)
            {
                used[i] = true;
                path.push_back(tickets[i][1]);
                backtraking(tickets,tickets[i][1],used);
                used[i] = false;
                path.pop_back();
            }
        }
        return;
    }
    vector<string> findItinerary(vector<vector<string>>& tickets) {
        vector<bool> used(tickets.size(),false);
        sort(tickets.begin(),tickets.end(),compare());
        // for(auto i:tickets) 
        // {
        //      cout<<'[';
        //     for(auto j:i)
        //     {
        //          cout<<j<<' ';
        //     }
        //      cout<<']';
        // }
        path.push_back("JFK");
        backtraking(tickets,"JFK",used);
        return resul;
    }
};
相关文章
|
6月前
|
算法 测试技术 C#
【贪心算法】LeetCode2071:你可以安排的最多任务数目
【贪心算法】LeetCode2071:你可以安排的最多任务数目
|
6月前
leetcode-332:重新安排行程
leetcode-332:重新安排行程
54 0
|
6月前
|
算法
leetcode332重新安排行程刷题打卡
leetcode332重新安排行程刷题打卡
31 0
|
6月前
|
算法 测试技术
【贪心算法】LeetCode2071:你可以安排的最多任务数目
【贪心算法】LeetCode2071:你可以安排的最多任务数目
|
存储 算法 Java
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
代码随想录刷题|LeetCode 332.重新安排行程 51. N皇后 37. 解数独
|
算法
​LeetCode刷题实战332:重新安排行程
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
126 0
​LeetCode刷题实战332:重新安排行程
|
SQL 数据库
LeetCode(数据库)- 行程和用户
LeetCode(数据库)- 行程和用户
118 0
|
SQL 算法
​LeetCode刷题实战262:行程和用户
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
114 0
LeetCode 2071. 你可以安排的最多任务数目(二分查找)
LeetCode 2071. 你可以安排的最多任务数目(二分查找)
204 0
|
算法 搜索推荐
[leetcode/lintcode 题解] 算法面试真题详解:安排面试城市
[leetcode/lintcode 题解] 算法面试真题详解:安排面试城市
[leetcode/lintcode 题解]  算法面试真题详解:安排面试城市