## 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),
cost, sizeof(cost) / sizeof(cost)) == 1);

printf("all tests passed!\n");

return 0;
}
``````
Copy The Code &

Input

cmd
gas = [1,2,3,4,5], cost = [3,4,5,1,2]

Output

cmd
3

### #2 Code Example with C++ Programming

```Code - C++ Programming```

``````
class Solution {
public:
int canCompleteCircuit(vector& gas, vector& 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];
}
}
};
``````
Copy The Code &

Input

cmd
gas = [1,2,3,4,5], cost = [3,4,5,1,2]

Output

cmd
3

### #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 &

Input

cmd
gas = [2,3,4], cost = [3,4,3]

Output

cmd
-1

### #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
}
}
}
``````
Copy The Code &

Input

cmd
gas = [2,3,4], cost = [3,4,3]

Output

cmd
-1

### #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 &

Input

cmd
gas = [1,2,3,4,5], cost = [3,4,5,1,2]

Output

cmd
3

### #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;
}
}
}
}
}
``````
Copy The Code &

Input

cmd
gas = [1,2,3,4,5], cost = [3,4,5,1,2]

Output

cmd
3