求出 最少乘坐的公交车数量 。

逛论坛的时候刷到的。觉得有点兴趣就自己写了一下。
给你一个数组 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);

输出结果

image.png

image.png

第二种写法

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();

结果
image.png

具体的返回就懒得写了。过程大概就这样

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值