这个题目,只要理清里路,代码就容易写了,下面是我提交的代码,耗时10ms.
思路:
1.寻找第一个left[i]>0的站点S,作为起始站点。此时(gas[i]>cost[i])
2.以S作为起始站点,判断其合法性,如果合法,则返回其下标,不合法则进入第3步
3.寻找非连续的下一个left[i]>0的站点作为S,转入第2步。(因为如果S合法,那么和S相连的left[i]>0的站点也一定不合法)
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
int n=gas.size();
if(1==n)return gas[0]>=cost[0]?0:-1;
vector<int>left(n,0);
for(int i=0;i<n;i++)left[i]=gas[i]-cost[i];
int i=0;
while(i<n&&left[i]<=0)i++;
if(i==n)return -1;
while(i<n){
int sum=left[i];
bool state=true;
for(int j=(i+1)%n;j!=i;j=(j+1)%n){
sum+=left[j];
if(sum<0){state=false;break;}
}
if(state)return i;
while(i<n&&left[i]>0)i++;
while(i<n&&left[i]<=0)i++;
}
return -1;
}
程序,容易出错的点:
1.只有一个站点的时候,也要判断gas和cost的大小
2.内层循环,要对下表是否越界进行判断