題目
來源:力扣(LeetCode)
鏈接:加油站
解法一
使用二重循環, 從0到gasSize枚舉i,從第i個加油站出發枚舉,若可以到達下一個加油站,令j=i+1,記下每到下一個站剩下的油量,若油量小於0.,則無法繞環路一週,退出該層循環,否則開往下一個加油站。循環至j==i。
時間複雜度爲O(n2)
代碼
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
int curgas=0;
for(int i=0;i<gasSize;i++){
curgas=gas[i]-cost[i]; //能否達到第i+1個加油站
if(curgas<0) continue;// 從第i個加油站出發無法繞環路一週
int j=(i+1)%gasSize;
while(j!=i){
curgas=curgas+gas[j]-cost[j];//開往下一個加油站剩下的油量
if(curgas<0)
break; //無法到達下一個加油站
j=(j+1)%gasSize;
}
if(j==i)
return i;
}
return -1;
} // o(n^2) 的複雜度
解法二
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize){
int curGas=0;
int sumRemainGas=0;
int st=0;
for(int i=0;i<gasSize;i++){
sumRemainGas+=gas[i]-cost[i];
curGas+=gas[i]-cost[i]; //存儲從st站出發到第i+1站臺剩下的油量
if(curGas<0){
st=i+1;
curGas=0;
}
}
if(sumRemainGas>=0)
return st;
else
return -1;
} // o(n) 的複雜度