LeetCode_medium_332. Reconstruct Itinerary

最近在刷Leetcode,希望以此来记录自己编写代码的一些想法。


一开始的思路:

从"JFK"开始找,得到与起点相连的终点,并且字母序最小,并将终点作为下一个起点,并将已经用完的tickets记录删除,继续找下一个终点,直至tickets都用完。

出现的bug在于:字母序最小的那个顺序可能会无解。

例如:[A,C],[A,D],[D,A] 规定从A开始。

如果按照我的算法:只能算到 A->C, 然后后面就陷入死循环。

简单地说就是我们还需要考虑这条路能不能把所有的tickets都用完。

class Solution {
public:

    string ff(vector<pair<string, string> > &tickets,string s){
    	vector<pair<string, string> >::iterator it;
    	vector<pair<string, string> >::iterator it2;
    	string result = "ZZZ";
    	for(it = tickets.begin();it!=tickets.end();it++)
    	{
    		if((*it).first == s && (*it).second < result)
    		{
    			result = (*it).second;
    			it2=it;
    		}
    	}
    	result = (*it2).second;
    	tickets.erase(it2);
    	return result;
    }
    
    vector<string> findItinerary(vector<pair<string, string>> tickets) {
    	vector<string> r;
    	r.push_back("JFK");
    	string s = "JFK"; 
    	while(!tickets.empty()){
    		s=ff(tickets,s);
    		r.push_back(s);
    	}
    	return r;
    }
};


接着,又改变了一种想法,用深度优先搜索来做,深度优先搜索一直都是我的一个盲点,借此机会来记录一下,同时也用到了很多STL的知识,比如multiset,map,vector,stack......

继续回到我们的例子教学:

例如:[A,C],[A,D],[D,A] 规定从A开始。

vector<pair<string, string> >tickets [A,C],[A,D],[D,A]

map<string,multiset<string> >buf

stack<string>dfs

vector<string>result

multiset的作用:

1.自动排序

2.容许重复的值出现,如果是set的话就会去重

dfs                                                      buf                                                                             result                                            
AA->C,D
D->A
 
A->CA->D
D->A
 
AA->D
D->A
C
A->DA->NULL
D->A
C
A->D->AA->NULL
D->NULL
C
A->DA->NULL
D->NULL
C->A
AA->NULL
D->NULL
C->A->D
NULLA->NULL
D->NULL
C->A->D->A
NULLA->NULL
D->NULL
A->D->A->C

class Solution {
public:
    vector<string> findItinerary(vector<pair<string, string>> tickets) {  
        vector<string> result;  
        int n = tickets.size();  
  
        if (n < 1)  
        {  
            return result;  
        }  
  
        map<string, multiset<string> > buf;  
        for (int i = 0; i < n; i++)  
        {  
            buf[tickets[i].first].insert(tickets[i].second);  
        }  
  
        stack<string> dfs;  
        dfs.push("JFK");  
        while (!dfs.empty())  
        {  
            string top = dfs.top();  
            if (buf[top].empty())  
            {  
                result.push_back(top);  
                dfs.pop();  
            }  
            else  
            {  
                dfs.push(*buf[top].begin());  
                buf[top].erase(buf[top].begin());  
            }  
        }  
        reverse(result.begin(), result.end());  
  
        return result;  
    }  
};
编程中注意需要注意到的点

1.n<1的情况 直接返回空

2.map访问两个元素,first,second来访问

3. pair<string,string>, 插入值用make_pair()这个函数

4.删除map的元素,用erase函数,erase(指针or值),如果是指针就只把指针指向的值删除,而值的话是把队列中所有相同的值都删去

buf[top].erase(buf[top].begin)

buf[top].erase(*(buf[top].begin))

5.stack直接反转的函数是reverse(起始指针,结束指针)


今天记录到这里,坚持!




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值