题目描述
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
说明:
如果题目有解,该答案即为唯一答案。
输入数组均为非空数组,且长度相同。
输入数组中的元素均为非负数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/gas-station
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
首先先要明白:如果一个数组的总和非负,那么一定可以找到一个起始位置,从他开始绕数组一圈,累加和一直都是非负的。
从头到尾遍历数组,记录总的剩余油量total_gas(sum(gas) - sum(cost))以及从某一点出发到现在的剩余油量cur_gas。遍历到某一点,更新total_gas+=gas[i]-cost[i],cur_gas+=gas[i]-cost[i],判断cur_gas是否小于0,如果小于0,说明无法以前面的点为起点到达现在的点,所以将cur_gas置0,记录当前点为新的起点;如果大于等于0,说明可以以前面的点为起点到达现在的点,继续遍历下一点。最后判断total_gas是否大于0来判断能否从某一点开始遍历完所有加油站,返回起点位置。
代码(c++)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int total_gas=0;
int cur_gas=0;
int index=0;
for(int i=0;i<gas.size();i++){
total_gas+=gas[i]-cost[i];
cur_gas+=gas[i]-cost[i];
if(cur_gas<0){
index=i+1;
cur_gas=0;
}
}
return total_gas>=0?index:-1;
}
};