写到一半的暴力算法才想起来可以用动态规划,但是还是不死心写完跑了一下,果然超时,还是乖乖换成动态规划吧
class Solution {
public:
int canCompleteCircuit(vector<int> &gas, vector<int> &cost) {
if(gas.empty()||cost.empty()||gas.size()!=cost.size()||(gas.size()==1&&cost.size()==1&&gas[0]<cost[0]))
return -1;
if(gas.size()==1&&cost.size()==1&&gas[0]>=cost[0])
return 0;
int sum;
int i;
int src;
src=0;
sum=0;
for(i=0;i<gas.size();i++)//从第一个gas容量大于消耗量开始
{
if(gas[i]-cost[i]>=0)
{
src=i;
sum=gas[i]-cost[i];
break;
}
}
if(i==gas.size())
return -1;
for(i=(src+1)%gas.size();i!=src;i=(i+1)%gas.size())
{//动态规划的思想,若出现<0,则从下一站重新开始
sum=sum+gas[i]-cost[i];
if(sum<0)
{
if((i+1)%gas.size()==src||(i+1==gas.size()))
//这个判定条件折腾了我好长时间,[2,4],[3,4]这个测试用例可以解释为什么要加第一个条件的原因,考虑到死循环
return -1;
src=(i+1)%gas.size();
sum=gas[src]-cost[src];
i=src;
}
}
return src;
}
};