问题
https://leetcode.com/problems/gas-station/
解法
首先有两个性质:
1, If car starts at A and can not reach B. Any station between A and B
can not reach B.(B is the first station that A can not reach.)
2, If the total number of gas is bigger than the total number of cost. There must be a solution.
1, 很容易证明, 如果station s 位于A, B 之间, 则从A到s 时 tank >= 0, 如果从s出发,则tank = 0, 显然从s 出发不能到达B
2, 首先预处理出Delt[] = gas[] - cost[], 则Delt 表示到每个站tank 变化情况。由于所有cost 之和 小于 gas 之和, 因此 Delt 之和 >= 0.假设下面程序运行后ret == n, 则表示Delt 之和< 0 , 与假设矛盾, 因此ret 必然小于n;
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int tank = 0;
int delt = 0;
int ret = 0;
for (int i=0; i<gas.size(); ++i)
{
tank+= gas[i] - cost[i];
delt += gas[i] - cost[i];
if (tank < 0)
{
ret = i+1;
tank = 0;
}
}
return delt >=0 ? ret:-1;
}
};