0
点赞
收藏
分享

微信扫一扫

【每日算法Day 62】LeetCode 815. 公交路线


题目描述

【每日算法Day 62】LeetCode 815. 公交路线_双指针

示例1


输入:
routes = [[1, 2, 7], [3, 6, 7]]
S = 1
T = 6
输出:
2
解释:
最优策略是先乘坐第一辆公交车到达车站 7, 然后换乘第二辆公交车到车站 6。


提示

【每日算法Day 62】LeetCode 815. 公交路线_时间复杂度_02


题解

【每日算法Day 62】LeetCode 815. 公交路线_时间复杂度_03

代码

c++


class Solution {
public:
int numBusesToDestination(vector<vector<int>>& routes, int S, int T) {
if (S == T) return 0;
int n = routes.size();
for (int i = 0; i < n; ++i) {
sort(routes[i].begin(), routes[i].end());
routes[i].erase(unique(routes[i].begin(), routes[i].end()), routes[i].end());
}
routes.push_back({S});
routes.push_back({T});
vector<vector<int>> G = buildGraph(routes, S, T);
return BFS(G);
}

vector<vector<int>> buildGraph(vector<vector<int>>& routes, int S, int T) {
int n = routes.size();
vector<vector<int>> G(n);
for (int i = 0; i < n; ++i) {
for (int j = i+1; j < n; ++j) {
int su = routes[i].size(), sv = routes[j].size();
int u = 0, v = 0;
while (u < su && v < sv) {
if (routes[i][u] < routes[j][v]) ++u;
else if (routes[i][u] > routes[j][v]) ++v;
else {
G[i].push_back(j);
G[j].push_back(i);
break;
}
}
}
}
return G;
}

int BFS(vector<vector<int>>& G) {
int n = G.size();
int S = n - 2;
int T = n - 1;
vector<int> dis(n, -1);
queue<int> Q;
Q.push(S);
dis[S] = 0;
while (!Q.empty()) {
int u = Q.front();
Q.pop();
for (int i = 0, sz = G[u].size(); i < sz; ++i) {
int v = G[u][i];
if (dis[v] == -1) {
Q.push(v);
dis[v] = dis[u] + 1;
if (v == T) return dis[v]-1;
}
}
}
return -1;
}
};


举报

相关推荐

0 条评论