Gas Station
Table of Contents + β
Gas Station feels like a road trip puzzle. There is a ring of stations around a track. Each one gives you some fuel and charges you some fuel to reach the next. You want one starting station from which you can drive the full loop. The slow way tries starting from every station. The fast way solves it in one pass. The leap there is the real test.
π― The Problem
You get two arrays of the same length and must find one valid starting station for the loop.
gas[i]is the fuel you pick up at stationi.cost[i]is the fuel needed to drive from stationito the next one.- The stations form a circle. After the last one you loop back to the first.
- You start with an empty tank.
- Return the index of a station you can begin from and drive all the way around once.
- If no such station exists, return
-1. The valid start is unique when it exists.
Let us say gas = [1, 2, 3, 4, 5] and cost = [3, 4, 5, 1, 2]. Starting at station 3 works. So the answer is 3.
Input: gas = [1, 2, 3, 4, 5], cost = [3, 4, 5, 1, 2]Output: 3
Explanation: Start at station 3. Tank fills and never drops below zero around the loop.The key number at each station is the net fuel, which is gas[i] - cost[i]. If it is positive you gain fuel there. If it is negative you lose fuel. Here is the ring with the net at each station.
π’ Approach 1: Try Every Start (Brute Force)
Pick each station as a possible start and simulate the full loop.
The idea:
- Try station
0first. Drive the whole circle and track the tank. - If the tank never drops below zero, that station is the answer.
- If it drops below zero, try station
1, then2, and so on.
How it works:
- Outer loop picks the starting station.
- Inner loop drives the loop from that start and adds each net.
- Stop a start early the moment the tank goes negative.
Why it is weak:
- For each start you may drive the whole loop again.
- That is a loop inside a loop.
- Time grows as O(nΒ²). Too slow on many stations.
Here is the try-every-start code:
def can_complete_circuit(gas, cost): n = len(gas) for start in range(n): tank = 0 for step in range(n): i = (start + step) % n tank += gas[i] - cost[i] if tank < 0: break else: return start return -1β‘ Approach 2: One Pass With Total and Tank (Best)
The idea in one line: one sweep tells you both whether an answer exists and where it starts.
The idea:
- The
totalof all nets says if the loop is possible at all. - The running
tanksays where a valid start begins. - A net is
gas[i] - cost[i], the fuel you gain or lose.
How it works:
- Sum every net into
total. If the whole system has less gas than cost, no start works. - Keep a running
tankfrom the current start. Add each net to it. - When
tankdrops below zero, the current start fails. Movestartto the next station and resettankto0. - At the end, return
startiftotal >= 0, else-1.
Why it is fast:
- You walk the stations only once. So it is O(n).
- You can skip every failed station in between. They had even less fuel for that same stretch, so none of them could survive it.
- Greedy here means you jump the start forward past every station that just failed and trust it.
Here is a dry run on gas = [1, 2, 3, 4, 5], cost = [3, 4, 5, 1, 2]. Watch the tank reset and the start move to 3.
Steps to Solve
- Keep a
totalof all nets and a runningtank, both starting at0. Setstart = 0. - Walk through the stations once. Compute each net as
gas[i] - cost[i]. - Add the net to both
totalandtank. - If
tankdrops below zero, setstarttoi + 1and resettankto0. - After the loop, if
totalis negative, return-1, because no start can finish. - Otherwise return
start.
This Python version keeps a total, a running tank, and a candidate start in plain variables.
def can_complete_circuit(gas, cost): total = 0 # net fuel across all stations tank = 0 # running tank from the current start start = 0 # candidate starting station for i in range(len(gas)): net = gas[i] - cost[i] total += net tank += net if tank < 0: # current start failed start = i + 1 # try the next station tank = 0 # empty tank again return start if total >= 0 else -1
gas = [1, 2, 3, 4, 5]cost = [3, 4, 5, 1, 2]print(can_complete_circuit(gas, cost))The output of the above code will be:
3Let us walk through the Python version line by line, because two ideas are packed into one short loop.
total = 0, tank = 0, start = 0 set up the three numbers. total sums every net to decide if the trip is even possible. tank is the fuel since the current start. start is the station we currently believe is the answer.
for i in range(len(gas)): walks every station once. There is no inner loop, which is exactly why this is fast.
net = gas[i] - cost[i] is the fuel you gain or lose at this station. Positive means you collect more than you spend.
total += net and tank += net add the net to both running sums. total never resets. tank does.
if tank < 0: is the failure check. If the tank goes negative, you cannot reach this station from the current start. So that start, and every station before this one in the stretch, is ruled out.
start = i + 1 jumps the start to the next station. tank = 0 empties the tank for the fresh start.
return start if total >= 0 else -1 gives the final answer. If the whole system had enough fuel, start is correct. If not, no start works, so return -1.
β±οΈ Time and Space Complexity
The brute force tries every station as a start and may drive the full loop each time, so it is O(nΒ²). The greedy way keeps three numbers and one loop. So it trades nothing and still wins. That takes the time all the way down to O(n) with O(1) extra space.
| Approach | Time Complexity | Space Complexity |
|---|---|---|
| Brute force (try every start) | O(nΒ²) | O(1) |
| Greedy total and tank | O(n) | O(1) |
Tip
The two facts work together. The total tells you whether any answer exists. The running tank tells you where it starts. Explain both out loud, and the interviewer sees you understand why one pass is enough.
π§© Key Takeaways
- β
The net at each station is
gas[i] - cost[i], the fuel you gain or lose there. - β
If the total of all nets is negative, no start can finish, so return
-1. - β When the running tank goes below zero, move the start to the next station and reset the tank.
- β You can skip all the failed stations in between, because they had even less fuel for that stretch.
- β This runs in O(n) time with O(1) extra space, beating the O(nΒ²) brute force.
Check Your Knowledge
Test what you learned. Pick an answer for each question, then click Check.
- 1
What does the Gas Station problem ask you to return?
Why: You return the index of a valid starting station, or -1 if no start can complete the circuit.
- 2
What is the net fuel at station i?
Why: Net fuel is gas[i] - cost[i], how much you gain or lose at that station.
- 3
When the running tank drops below zero, what does the greedy solution do?
Why: A negative tank rules out the current start and every station in the stretch, so start jumps to i + 1.
- 4
What is the time and space complexity of the greedy approach?
Why: One pass over the stations is O(n), and three counters use O(1) extra space.