导读:粉丝们反馈,LeetCode上的题目太多了,多到无从下手,特别是hard模式的题目。算法哥专注分享hard模式的题目,争取每个类型的题目都分享到!聪明的粉丝跟着算法哥一起来学习吧!
我们有一系列公交路线。每一条路线 routes[i] 上都有一辆公交车在上面循环行驶。例如,有一条路线 routes[0] = [1, 5, 7],表示第一辆 (下标为0) 公交车会一直按照 1->5->7->1->5->7->1->... 的车站路线行驶。
假设我们从 S 车站开始,要去往 T 站。 期间仅可乘坐公交车,求出最少乘坐的公交车数量。返回 -1 表示不可能到达终点车站。
示例: 输入: routes = [[1, 2, 7], [3, 6, 7]] S = 1 T = 6 输出: 2 解释: 最优策略是先乘坐第一辆公交车到达车站 7, 然后换乘第二辆公交车到车站 6。
说明:
题目来源:leetcode815. Bus Routes
没算法经验的粉丝初次看到这个题目,可能有那么一点点难度,尤其被打上了hard模式的标签,其实算法哥认为,这个题目只是一个BFS入门题而已!
题目要求出从站点s去站点t,最少需要搭乘几辆公交车,很简单!首先我们对于起点站,枚举每一辆没有搭乘过的公交车,看每次换乘可以达到的站点,假设这些站点为t1,t2...,显然这些站点只需要搭乘一辆公交车1次就到了;接下来,我们用同样的方法,对于每个站点t1,t2...,枚举每一辆没有搭乘过的公交车,记录下此次换乘可以到达的站点,这一批站点就是搭乘2辆公交车能够到达的战点,以此类推,就是不断BFS的过程!
直接上源码,大家对照源码理解:
源码
源码分析:
虽然说这是个简单的BFS,但是BFS里面往往涉及队列操作,以及需要对一些遍历过的状态进行hash,以防止重复BFS,代码用C 写的,C 提供了丰富的STL标准模板库,代码写起来方便很多,对于采用java的粉丝们来说,问题也不大,如果使用纯C语言,写起来会稍微麻烦点。
很显然,极端情况,每个站点都遍历一遍,总共有500*500=250000个站点,每个公交车均摊到每次遍历,所以总的复杂度是10^6级别的,足够通过题目的测试了!上述源码在leetcode上提交轻松击败98%的提交!
程序运行性能对比
通过今天这个题目,我们再一次看到了BFS的运用,其实BFS的题目,往往有一个模式可以套用,无非就是队列queue hash结合运用,对于没有枚举过的状态,入队,直到遍历完所有状态!
书读百遍其义自见!对于算法题,要真正理解,还需要自己多实践,这样才能在实际的面试中或者工作中,正确、迅速的写出来!
今天的分享到此结束,麻烦动动手指,帮算法哥上头条吧,您的关注,转发,点赞,收藏都是对算法哥的最大鼓励!
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved