逛论坛的时候刷到的。觉得有点兴趣就自己写了一下。
给你一个数组 routes,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。
例如,路线 routes[0] = [1, 5, 7] 表示第 0 辆公交车会一直按序列 1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ... 这样的车站路线行驶。 现在从 source 车站出发(初始时不在公交车上),要前往 target 车站。 期间仅可乘坐公交车。
求出 最少乘坐的公交车数量 。如果不可能到达终点车站,返回 -1 。
示例 1:
输入:routes = [[1,2,7],[3,6,7]], source = 1, target = 6
输出:2
解释:最优策略是先乘坐第一辆公交车到达车站 7 , 然后换乘第二辆公交车到车站 6 。
示例 2:
输入:routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
输出:-1
// var routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]];
var routes = [[1,2,7],[3,6,7]];
// var source = 15, target = 12;
var source = 1, target = 6;
var counts = [];
var exclude = [];
var countsIndex = () => { return counts.length-1;}
routes.forEach(item=>{
if(item.includes(source)){
exclude=[];
counts.push([source]);
exclude.push(item);
if(!item.includes(target)){
var bool = false
item.forEach(num=>{
var b = fun(num,target);
if(b)
bool = true
})
if(!bool)//如果该线路无法到达终点则删除
counts.splice(countsIndex(),1);
}
}
})
function fun(from = source, to = target) {
var list = routes.filter(item=> !exclude.includes(item))
for (const item of list) {
if(item.includes(from) && item.includes(to) ){
exclude.push(item);
if(item.includes(to)){
counts[countsIndex()].push(to)
return true;
}else{
item.forEach(num=>{
if(fun(num,to)){
counts[countsIndex()].push(from)
return true;
}
})
}
}
}
return false;
}
console.log(counts);
输出结果
第二种写法
function fun2() {
var routes = [
[7, 12],
[4, 5, 15],
[6],
[15, 19],
[9, 12, 13]
];
var source = 15,
target = 12;
/* var routes = [[1,2,7],[3,6,7]];
var source = 1, target = 6; */
var 线路s = [];
var exclude = [];
for (let index = 0; index < routes.length; index++) {
const elements = routes[index];
var 线路 = new Set();
if (!exclude.includes(elements)) { //如果没有被排除则添加到新线路中
elements.forEach(item => 线路.add(item));
//排除
exclude.push(elements);
}
for (const item of routes) {
if (!exclude.includes(item)) { //判断当前车站是否已经被排除
var b = false
for (const iterator of item) {
if (线路.has(iterator)) ////判断当前车站是否存在于线路中
{
b = true;
break;
}
}
if (b) { //如果存在于线路中则合并
item.forEach(e => 线路.add(e))
exclude.push(item);
}
}
}
if (线路.size > 0)
线路s.push(Array.from(线路));
}
console.log(线路s);
}
fun2();
结果
具体的返回就懒得写了。过程大概就这样