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.
沿着一条环形路线有 n 个加油站,第 i
个加油站有 gas[i] 单位的汽油。
你有一辆油箱无限的汽车,从第 i
个加油站到下一个(即第 i + 1
个)加油站需要消耗 cost[i] 单位的汽油。你从一个加油站开始旅行时油箱为空。
给定两个整数数组 gas 和 cost,如果你能顺时针方向绕环形路线走一圈,则返回起始加油站的索引,否则返回 -1。如果存在解决方案,它保证是唯一的。
Example 1:
gas = [1,2,3,4,5]
, cost = [3,4,5,1,2]
3
Example 2:
gas = [2,3,4]
, cost = [3,4,3]
-1
n == gas.length == cost.length
1 <= n <= 10^5
0 <= gas[i], cost[i] <= 10^4
这段代码的目的是找出能够绕环形路线走一圈的起始加油站索引。
- 首先,我们需要判断总油量是否大于等于总消耗量,这个条件等价于 是否存在一个加油站可以作为起点驾驶一圈。
如果以上条件满足,说明 一定存在一个加油站作为起点可以驾驶一圈,我们可以逐个排除。
举个例子,假设存在1-4这四个加油站,如果以1为起点,开始遍历,结果发现在3号加油站无法到达4号加油站,说明1、2、3号加油站都不能作为起点。
用以上的方法进行遍历排除所有无法驾驶一圈的加油站起点,最终剩下的就是满足题意得起点加油站。
算法的关键步骤如下:
计算总油量和总消耗:
accumulate
函数计算所有加油站的总油量 (totalGas
) 和总消耗 (totalCost
)。-1
。遍历加油站:
start
为0,表示可能的起始加油站索引。currentGas
为0,表示当前油量。currentGas
为当前加油站提供的油量减去到下一个加油站的消耗。currentGas
变为负数,说明从 start
到当前加油站的任何一个都不可能作为起始加油站,因此将 start
设置为 i + 1
(下一个加油站的索引),并重置 currentGas
。返回结果:
start
存储的是能够完成整个环路的起始加油站索引。class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int totalGas = accumulate(gas.begin(), gas.end(), 0);
int totalCost = accumulate(cost.begin(), cost.end(), 0);
if (totalCost > totalGas) return -1;
int start = 0, currentGas = 0;
for (int i = 0; i < gas.size(); i++) {
currentGas += gas[i] - cost[i];
if (currentGas < 0) {
start = i + 1;
currentGas = 0;
}
}
return start;
}
};