当且仅当最小值在开始运油位置处时,才是合格的起点。因此算法就是一直搜索最小值是不是在起点位置。
如果gas=[4,1,2,3,4,5,6],cost=[5,1,2,3,5,7,3]。那么假设起点在第一个位置,那么产生的结果为[0,-1,-1,-1,-1,-1,-2,-4,-1,-2,-2,-2,-2,-3,-5],判断长度为n+1的区间上,最小值在不在起点。如果找不到,那么返回-1.
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n=gas.size();
vector<int> dp(n*2,0);
int minGas=0;
int minPos=0;
int i=1;
for(i=1;i<=n;i++)
{
dp[i]=dp[i-1]+gas[(i-1)%n]-cost[(i-1)%n];
if(minGas>dp[i])
{
minGas=dp[i];
minPos=i;
}
}
i--;
while(i<2*n)
{
if(minPos==i-n)
return minPos;
i++;
dp[i]=dp[i-1]+gas[(i-1)%n]-cost[(i-1)%n];
if(minGas>dp[i])
return -1;
}
return -1;
}
};