|
| 1 | +# Gas Station |
| 2 | + |
| 3 | +## Problem Description |
| 4 | + |
| 5 | +There are n gas stations along a circular route, where the amount of gas at the ith station is `gas[i]`. |
| 6 | + |
| 7 | +You have a car with an unlimited gas tank and it costs `cost[i]` of gas to travel from the `i`th station |
| 8 | +to its next `(i + 1)`th station. You begin the journey with an empty tank at one of the gas stations. |
| 9 | + |
| 10 | +Given two integer arrays `gas` and `cost`, return the starting gas station's index if you can travel |
| 11 | +around the circuit once in the clockwise direction, otherwise return -1. If there exists a solution, |
| 12 | +it is guaranteed to be unique. |
| 13 | + |
| 14 | +**Example 1:** |
| 15 | + |
| 16 | +* Input: `gas = [1,2,3,4,5], cost = [3,4,5,1,2]` |
| 17 | +* Output: `3` |
| 18 | +* Explanation: |
| 19 | + * Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4 |
| 20 | + * Travel to station 4. Your tank = 4 - 1 + 5 = 8 |
| 21 | + * Travel to station 0. Your tank = 8 - 2 + 1 = 7 |
| 22 | + * Travel to station 1. Your tank = 7 - 3 + 2 = 6 |
| 23 | + * Travel to station 2. Your tank = 6 - 4 + 3 = 5 |
| 24 | + * Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3. |
| 25 | + * Therefore, return 3 as the starting index. |
| 26 | + |
| 27 | +**Example 2:** |
| 28 | + |
| 29 | +* Input: `gas = [2,3,4], cost = [3,4,3]` |
| 30 | +* Output: `-1` |
| 31 | +* Explanation: |
| 32 | + * You can't start at station 0 or 1, as there is not enough gas to travel to the next station. |
| 33 | + * Let's start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4 |
| 34 | + * Travel to station 0. Your tank = 4 - 3 + 2 = 3 |
| 35 | + * Travel to station 1. Your tank = 3 - 3 + 3 = 3 |
| 36 | + * You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3. |
| 37 | + * Therefore, you can't travel around the circuit once no matter where you start. |
| 38 | + |
| 39 | +**Constraints:** |
| 40 | + |
| 41 | + |
| 42 | +* `n == gas.length == cost.length` |
| 43 | +* `1 <= n <= 10^5` |
| 44 | +* `0 <= gas[i], cost[i] <= 10^4` |
| 45 | +* The input is generated such that the answer is unique. |
| 46 | + |
| 47 | + |
| 48 | +## Solution |
| 49 | + |
| 50 | +```python |
| 51 | +def can_complete_circuit(gas: list[int], cost: list[int]) -> int: |
| 52 | + """ |
| 53 | + Determine the starting gas station's index to travel around a circular route once. |
| 54 | +
|
| 55 | + The car starts with an empty tank at one of the gas stations and has an unlimited gas capacity. |
| 56 | + It must be able to travel clockwise around all stations, refueling at each, without running out of gas. |
| 57 | +
|
| 58 | + :param gas: A list of integers where gas[i] represents the amount of gas at station i. |
| 59 | + :param cost: A list of integers where cost[i] represents the gas cost to travel from station i to i+1. |
| 60 | + :return: The index of the starting gas station if the circuit can be completed, otherwise -1. |
| 61 | + """ |
| 62 | + if sum(gas) < sum(cost): |
| 63 | + return -1 |
| 64 | + length = len(gas) |
| 65 | + current_tank = 0 |
| 66 | + start = -1 |
| 67 | + for index in range(length): |
| 68 | + current_tank += gas[index] - cost[index] |
| 69 | + if current_tank < 0: |
| 70 | + start = -1 |
| 71 | + current_tank = 0 |
| 72 | + elif start == -1: |
| 73 | + start = index |
| 74 | + return start |
| 75 | +``` |
| 76 | + |
| 77 | +* **Time Complexity:** $O(n)$ |
| 78 | +* **Space Complexity:** $O(1)$ |
| 79 | + |
| 80 | +## Explanation of the Solution |
| 81 | + |
| 82 | +This problem involves finding a starting gas station in a circular route such that a car can travel |
| 83 | +around all stations without running out of gas. The solution efficiently checks for the valid starting |
| 84 | +point using a greedy approach with cumulative gas tracking. |
| 85 | + |
| 86 | +1. Early Termination Check: |
| 87 | + * If total gas is insufficient, return `-1` immediately. |
| 88 | +2. Initialize Variables: |
| 89 | + * `current_tank = 0` → Tracks gas balance during the journey. |
| 90 | + * `start = -1` → Stores the candidate starting station. |
| 91 | +3. Iterate Through Stations: |
| 92 | + * For each station `i`, update `current_tank += gas[i] - cost[i]` (gas added minus gas spent). |
| 93 | + * If `current_tank < 0`: |
| 94 | + * The current candidate station (`start`) is invalid. |
| 95 | + * Reset `current_tank = 0` and mark `start = -1` (search for a new candidate). |
| 96 | + * If `current_tank >= 0` and no candidate is set (`start == -1`): |
| 97 | + * Set `start = i` (this station is a potential starting point). |
| 98 | +4. Return the Valid Start: |
| 99 | + * After the loop, start holds the unique valid station (since `sum(gas) >= sum(cost)` guarantees a solution). |
| 100 | + |
| 101 | +By resetting `current_tank` when it goes negative, we ensure the candidate station can cover all subsequent stations |
| 102 | +without deficits. |
| 103 | + |
| 104 | +The loop checks stations in order, and the `sum(gas) >= sum(cost)` condition ensures the remaining stations (after the |
| 105 | +candidate) can compensate for any prior deficits. |
0 commit comments