Algorithm
Problem Name: 134. 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
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.
Constraints:
n == gas.length == cost.length
1 <= n <= 105
0 <= gas[i], cost[i] <= 104
Code Examples
#1 Code Example with C Programming
Code -
C Programming
#include <stdio.h>
#include <assert.h>
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
if (gasSize != costSize) return -1;
int i;
int tank = 0, sum = 0;
int ans = 0;
for (i = 0; i < gasSize; i++) {
sum += gas[i] - cost[i];
tank += gas[i] - cost[i];
if (sum < 0) {
ans = i + 1;
sum = 0;
}
}
return tank >= 0 ? ans : -1;
}
int main() {
int gas[] = { 1, 2 };
int cost[] = { 2, 1 };
assert(canCompleteCircuit(gas, sizeof(gas) / sizeof(gas[0]),
cost, sizeof(cost) / sizeof(cost[0])) == 1);
printf("all tests passed!\n");
return 0;
}
Copy The Code &
Try With Live Editor
Input
Output
#2 Code Example with C++ Programming
Code -
C++ Programming
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n(gas.size()), sum(0), total(0), res(0);
for (int i = 0; i < n; ++i) {
sum += gas[i] - cost[i];
if (sum < 0) {
res = i + 1;
sum = 0;
}
total += gas[i] - cost[i];
}
return total >= 0 ? res : -1;
}
};
Copy The Code &
Try With Live Editor
Input
Output
#3 Code Example with Java Programming
Code -
Java Programming
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int n = gas.length;
int tankCapacity = 0;
int currTankCapacity = 0;
int startingStation = 0;
for (int i = 0; i < n; i++) {
tankCapacity += gas[i] - cost[i];
currTankCapacity += gas[i] - cost[i];
if (currTankCapacity < 0) {
startingStation = i + 1;
currTankCapacity = 0;
}
}
return tankCapacity >= 0 ? startingStation : -1;
}
}
Copy The Code &
Try With Live Editor
Input
Output
#4 Code Example with Javascript Programming
Code -
Javascript Programming
const canCompleteCircuit = function(gas, cost) {
let total = 0
let curLeft = 0
let curtIdx = 0
for (let i = 0; i < gas.length; i++) {
total += gas[i] - cost[i]
curLeft += gas[i] - cost[i]
if (curLeft < 0) {
curtIdx = i + 1
curLeft = 0
}
}
return total < 0 ? -1 : curtIdx
}
Copy The Code &
Try With Live Editor
Input
Output
#5 Code Example with Python Programming
Code -
Python Programming
class Solution:
def canCompleteCircuit(self, gas, cost, cur = 0, index = 0):
for i in range(len(gas)):
cur += gas[i] - cost[i]
if cur < 0: cur, index = 0, i + 1
return index if index < len(gas) and sum(gas) >= sum(cost) else -1
Copy The Code &
Try With Live Editor
Input
Output
#6 Code Example with C# Programming
Code -
C# Programming
namespace LeetCode
{
public class _0134_GasStation
{
public int CanCompleteCircuit(int[] gas, int[] cost)
{
int totalGas = 0, currentTank = 0;
var startIndex = 0;
for (int i = 0; i < gas.Length; i++)
{
totalGas += gas[i] - cost[i];
currentTank += gas[i] - cost[i];
if (currentTank < 0)
{
startIndex = i + 1;
currentTank = 0;
}
}
return totalGas >= 0 ? startIndex : -1;
}
}
}
Copy The Code &
Try With Live Editor
Input
Output