134.加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。
输入:
gas = [1,2,3,4,5]
cost = [3,4,5,1,2]
输出: 3
解释:
从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int size=gas.size();//定义油箱数组的个数
int i=0;//定义i作为起点
while(i<size)//如果i起点还未遍历完
{
int sumgas=0,sumcost=0;//定义总油量,总耗油量
int count=0;//记录能走过的加油站数量
while(count<size)
{
int j=(i+count)%size;//定义j作为标号依次遍历gas和cost
sumgas+=gas[j];
sumcost+=cost[j];
if(sumcost>sumgas)//如果总耗油量大于总油量
{
break;//意味着不可继续走
}
count++;//可以走,继续加一
}
if(count==size)//意味着已走过一圈
{
return i;//返回起点标号
}
else
{
i=i+count+1;//未走完一圈,换起点,意味着中间不能作为起点。
}
}
return -1;//全部走完,未返回,返回-1
}
};