這個題目,只要理清里路,代碼就容易寫了,下面是我提交的代碼,耗時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.內層循環,要對下表是否越界進行判斷