LeetCode 0815. Bus Routes Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0815. Bus Routes

Description

You are given an array routes representing bus routes where routes[i] is a bus route that the ith bus repeats forever.

  • For example, if routes[0] = [1, 5, 7], this means that the 0th bus travels in the sequence 1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ... forever.

You will start at the bus stop source (You are not on any bus initially), and you want to go to the bus stop target. You can travel between bus stops by buses only.

Return the least number of buses you must take to travel from source to target. Return -1 if it is not possible.

 

Example 1:

Input: routes = [[1,2,7],[3,6,7]], source = 1, target = 6
Output: 2
Explanation: The best strategy is take the first bus to the bus stop 7, then take the second bus to the bus stop 6.

Example 2:

Input: routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
Output: -1

 

 

Constraints:

  • 1 <= routes.length <= 500.
  • 1 <= routes[i].length <= 105
  • All the values of routes[i] are unique.
  • sum(routes[i].length) <= 105
  • 0 <= routes[i][j] < 106
  • 0 <= source, target < 106

Solutions

Solution 1: BFS

First, we check if source and target are the same. If they are, we directly return 0.

Next, we use a hash table g to build a mapping from stops to bus routes. For each bus route, we traverse all the stops it passes through and map each stop to that bus route, i.e., g[stop] represents all bus routes passing through stop stop.

Then, we check if source and target are in the stop mapping. If they are not, we return -1.

We use a queue q to perform a breadth-first search (BFS). Each element in the queue is a tuple (stop, busCount), representing the current stop stop and the number of buses taken to reach the current stop busCount.

We initialize a set visBus to record the bus routes that have been visited and a set visStop to record the stops that have been visited. Then, we add source to visStop and (source, 0) to the queue q.

Next, we start the BFS. While the queue q is not empty, we take out the first element from the queue, which is the current stop stop and the number of buses taken to reach the current stop busCount.

If the current stop stop is the target stop target, we return the number of buses taken to reach the target stop busCount.

Otherwise, we traverse all bus routes passing through the current stop. For each bus route, we traverse all stops on that route. If a stop nextStop has not been visited, we add it to visStop and add (nextStop, busCount + 1) to the queue q.

Finally, if we cannot reach the target stop, we return -1.

The time complexity is O(L), and the space complexity is O(L), where L is the total number of stops on all bus routes.

PythonJavaC++GoTypeScriptC#
class Solution: def numBusesToDestination( self, routes: List[List[int]], source: int, target: int ) -> int: if source == target: return 0 g = defaultdict(list) for i, route in enumerate(routes): for stop in route: g[stop].append(i) if source not in g or target not in g: return -1 q = [(source, 0)] vis_bus = set() vis_stop = {source} for stop, bus_count in q: if stop == target: return bus_count for bus in g[stop]: if bus not in vis_bus: vis_bus.add(bus) for next_stop in routes[bus]: if next_stop not in vis_stop: vis_stop.add(next_stop) q.append((next_stop, bus_count + 1)) return -1(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !