Gas Station
There are `n` gas stations along a circular route, where the amount of gas at the `ith` station is `gas[i]`. You have a car with an unlimited gas tank and it costs `cost[i]` of gas to travel from the `ith` station to its next `(i + 1)th` station. You begin the journey with an empty tank at one of the gas stations. Given two integer arrays `gas` and `cost`, return the starting gas station's index if you can travel around the circuit once in the clockwise direction, otherwise return `-1`. If there exists a solution, it is guaranteed to be unique.
Examples
Constraints
n == gas.length == cost.length1 <= n <= 10^50 <= gas[i], cost[i] <= 10^4
Greedy Approach
Approach
First, check if a solution is possible: if the total gas is less than the total cost, we can never complete the circuit, so return -1. If `sum(gas) >= sum(cost)`, it's mathematically guaranteed that a unique solution exists. We can iterate through the stations, keeping a running total of our tank (`total = total + gas[i] - cost[i]`). If our tank becomes negative at any point, it means we cannot reach the next station from our current starting point. Furthermore, any station between our starting point and the current station is also invalid. So, we reset our tank to 0 and set the next station (`i + 1`) as our new tentative starting point.
Complexity Analysis
Time complexity is O(n) for computing the sum and doing one pass over the array. Space complexity is O(1) since we only use a few variables.
class Solution { public int canCompleteCircuit(int[] gas, int[] cost) { int totalGas = 0; int totalCost = 0; for (int i = 0; i < gas.length; i++) { totalGas += gas[i]; totalCost += cost[i]; } // If total cost is greater than total gas, impossible to complete the circuit if (totalCost > totalGas) { return -1; } int currentGas = 0; int startIndex = 0; for (int i = 0; i < gas.length; i++) { currentGas += (gas[i] - cost[i]); // If tank is empty, we can't reach the next station from the current start if (currentGas < 0) { // Try starting from the next station startIndex = i + 1; // Reset current gas currentGas = 0; } } return startIndex; }}