HomeLeetcode134. Gas Station - Leetcode Solutions

134. Gas Station – Leetcode Solutions

Description

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:

Example 1:

Input: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
Output: 3
Explanation:
Start at station 3 (index 3) and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 4. Your tank = 4 - 1 + 5 = 8
Travel to station 0. Your tank = 8 - 2 + 1 = 7
Travel to station 1. Your tank = 7 - 3 + 2 = 6
Travel to station 2. Your tank = 6 - 4 + 3 = 5
Travel to station 3. The cost is 5. Your gas is just enough to travel back to station 3.
Therefore, return 3 as the starting index.

Example 2:

Input: gas = [2,3,4], cost = [3,4,3]
Output: -1
Explanation:
You can't start at station 0 or 1, as there is not enough gas to travel to the next station.
Let's start at station 2 and fill up with 4 unit of gas. Your tank = 0 + 4 = 4
Travel to station 0. Your tank = 4 - 3 + 2 = 3
Travel to station 1. Your tank = 3 - 3 + 3 = 3
You cannot travel back to station 2, as it requires 4 unit of gas but you only have 3.
Therefore, you can't travel around the circuit once no matter where you start.

Solution in Python

Python
from typing import List

class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        # Total gas and total cost to check if a solution is possible
        total_gas = sum(gas)
        total_cost = sum(cost)
        
        # If the total gas is less than the total cost, it's impossible to complete the circuit
        if total_gas < total_cost:
            return -1
        
        # Initialize starting point and current tank gas
        start = 0
        current_gas = 0
        
        # Iterate through each gas station
        for i in range(len(gas)):
            # Update the current tank gas after refilling and traveling to the next station
            current_gas += gas[i] - cost[i]
            
            # If at any point, current_gas becomes negative, 
            # it means we cannot reach this station from the previous start
            if current_gas < 0:
                # We need to start from the next station
                start = i + 1
                # Reset current_gas for the new start
                current_gas = 0
        
        # The start index is the starting gas station
        return start

Explanation:

  1. Initialization:
    • total_gas and total_cost are computed to determine if the problem is solvable. If the total amount of gas available is less than the total cost needed to travel the entire route, then it’s impossible to complete the circuit.
  2. Check Feasibility:
    • If total_gas < total_cost, return -1 because the journey cannot be completed.
  3. Finding the Starting Point:
    • Initialize start to 0 and current_gas to 0.
    • Iterate over each gas station:
      • Calculate the net gas available at each station by subtracting the cost to travel to the next station from the gas available at the current station.
      • If current_gas becomes negative, it indicates that starting from the current start station can’t reach this station. Thus, update the starting station to i + 1 and reset current_gas to 0.
  4. Return Result:
    • After the loop, start will hold the index of the gas station from which the journey can be started to complete the circuit.

This approach ensures that we only traverse the list once, making the algorithm efficient with a time complexity of O(n).

Solution in Javascript

JavaScript
/**
 * @param {number[]} gas
 * @param {number[]} cost
 * @return {number}
 */
var canCompleteCircuit = function(gas, cost) {
    // Total gas and total cost to check if a solution is possible
    let totalGas = 0;
    let totalCost = 0;
    
    // Calculate total gas and total cost
    for (let i = 0; i < gas.length; i++) {
        totalGas += gas[i];
        totalCost += cost[i];
    }
    
    // If the total gas is less than the total cost, it's impossible to complete the circuit
    if (totalGas < totalCost) {
        return -1;
    }
    
    // Initialize starting point and current tank gas
    let start = 0;
    let currentGas = 0;
    
    // Iterate through each gas station
    for (let i = 0; i < gas.length; i++) {
        // Update the current tank gas after refilling and traveling to the next station
        currentGas += gas[i] - cost[i];
        
        // If at any point, currentGas becomes negative,
        // it means we cannot reach this station from the previous start
        if (currentGas < 0) {
            // We need to start from the next station
            start = i + 1;
            // Reset currentGas for the new start
            currentGas = 0;
        }
    }
    
    // The start index is the starting gas station
    return start;
};

Solution in Java

Java
class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        // Total gas and total cost to check if a solution is possible
        int totalGas = 0;
        int totalCost = 0;
        
        // Calculate total gas and total cost
        for (int i = 0; i < gas.length; i++) {
            totalGas += gas[i];
            totalCost += cost[i];
        }
        
        // If the total gas is less than the total cost, it's impossible to complete the circuit
        if (totalGas < totalCost) {
            return -1;
        }
        
        // Initialize starting point and current tank gas
        int start = 0;
        int currentGas = 0;
        
        // Iterate through each gas station
        for (int i = 0; i < gas.length; i++) {
            // Update the current tank gas after refilling and traveling to the next station
            currentGas += gas[i] - cost[i];
            
            // If at any point, currentGas becomes negative,
            // it means we cannot reach this station from the previous start
            if (currentGas < 0) {
                // We need to start from the next station
                start = i + 1;
                // Reset currentGas for the new start
                currentGas = 0;
            }
        }
        
        // The start index is the starting gas station
        return start;
    }
}

Solution in C#

C#
public class Solution {
    public int CanCompleteCircuit(int[] gas, int[] cost) {
        // Total gas and total cost to check if a solution is possible
        int totalGas = 0;
        int totalCost = 0;
        
        // Calculate total gas and total cost
        for (int i = 0; i < gas.Length; i++) {
            totalGas += gas[i];
            totalCost += cost[i];
        }
        
        // If the total gas is less than the total cost, it's impossible to complete the circuit
        if (totalGas < totalCost) {
            return -1;
        }
        
        // Initialize starting point and current tank gas
        int start = 0;
        int currentGas = 0;
        
        // Iterate through each gas station
        for (int i = 0; i < gas.Length; i++) {
            // Update the current tank gas after refilling and traveling to the next station
            currentGas += gas[i] - cost[i];
            
            // If at any point, currentGas becomes negative,
            // it means we cannot reach this station from the previous start
            if (currentGas < 0) {
                // We need to start from the next station
                start = i + 1;
                // Reset currentGas for the new start
                currentGas = 0;
            }
        }
        
        // The start index is the starting gas station
        return start;
    }
}

Subscribe
Notify of

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments

Popular