最近在刷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;
}
};
继续回到我们的例子教学:
例如:[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 |
A | A->C,D D->A | |
A->C | A->D D->A | |
A | A->D D->A | C |
A->D | A->NULL D->A | C |
A->D->A | A->NULL D->NULL | C |
A->D | A->NULL D->NULL | C->A |
A | A->NULL D->NULL | C->A->D |
NULL | A->NULL D->NULL | C->A->D->A |
NULL | A->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(起始指针,结束指针)
今天记录到这里,坚持!