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

简介: 公交路线

题目描述



image.png

示例1

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

提示

image.png


题解



image.png

代码


c++

classSolution {
public: 
intnumBusesToDestination(vector<vector<int>>&routes, intS, 
intT) {  
if (S==T) return0; 
intn=routes.size();  
for (inti=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);   
returnBFS(G);    }
vector<vector<int>>buildGraph(vector<vector<int>>&routes, intS, intT) {   
intn=routes.size();  
vector<vector<int>>G(n);  
for (inti=0; i<n; ++i) {  
for (intj=i+1; j<n; ++j) {   
intsu=routes[i].size(), sv=routes[j].size(); 
intu=0, v=0;    
while (u<su&&v<sv) {  
if (routes[i][u] <routes[j][v]) ++u;  
elseif (routes[i][u] >routes[j][v]) ++v;   
else {            
G[i].push_back(j);   
G[j].push_back(i);   
break;    
                    }           
                }         
            }     
        }    
returnG; 
    }
intBFS(vector<vector<int>>&G) {    
intn=G.size();    
intS=n-2;    
intT=n-1;   
vector<int>dis(n, -1); 
queue<int>Q;   
Q.push(S);     
dis[S] =0;   
while (!Q.empty()) {  
intu=Q.front();   
Q.pop();      
for (inti=0, sz=G[u].size(); i<sz; ++i) {  
intv=G[u][i];   
if (dis[v] ==-1) {      
Q.push(v); 
dis[v] =dis[u] +1;    
if (v==T) returndis[v]-1; 
                }      
            }    
        } 
return-1; 
    }
};

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~

相关文章
|
1月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
134 0
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
275 4
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
157 2
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
173 6
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
179 1
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
195 1
|
算法
刷算法Leetcode---9(二叉树篇Ⅲ)
刷算法Leetcode---9(二叉树篇Ⅲ)
125 3
|
算法 Java
[Java·算法·简单] LeetCode 283. 移动零
[Java·算法·简单] LeetCode 283. 移动零
122 2
|
算法 Java
[Java·算法·中等] LeetCode21. 合并两个有序链表
[Java·算法·中等] LeetCode21. 合并两个有序链表
236 2

热门文章

最新文章