hh1562535601的专栏

这题还是比较有意思的,会用到一些结论和性质,代码并不复杂。自己懒得写证明了,转载了别人的文章。

主要利用的性质就是:1.如果∑gas[i] >= ∑cost[i],则一定存在解,且题目保证解唯一;2.若在某个区间上,∑gas[i] < ∑cost[i],则出发点即解不可能在这个区间上。

第一个性质的大概证明(并非严格的数学证明)请看转载的这篇文章:

主要内容是:

a. 最开始,站点0是始发站,假设车开出站点p后,油箱空了,假设sum1 = diff[0] +diff[1] + … + diff[p],可知sum1 < 0;

b. 根据上面的论述,我们将p+1作为始发站,开出q站后,油箱又空了,设sum2 = diff[p+1] +diff[p+2] + … + diff[q],可知sum2 < 0。

c. 将q+1作为始发站,假设一直开到了未循环的最末站,油箱没见底儿,设sum3 =diff[q+1] +diff[q+2] + … + diff[size-1],可知sum3 >= 0。

要想知道车能否开回 q 站,其实就是在sum3 的基础上,依次加上 diff[0] 到 diff[q],看看sum3在这个过程中是否会小于0。但是我们之前已经知道diff[0] 到 diff[p-1] 这段路,油箱能一直保持非负,因此我们只要算算sum3 + sum1是否 <0,就知道能不能开到 p+1站了。如果能从p+1站开出,只要算算sum3 + sum1 + sum2 是否 < 0,就知都能不能开回q站了。

因为 sum1, sum2 都 < 0,因此如果sum3 + sum1 + sum2 >=0 那么sum3 + sum1 必然 >= 0,也就是说,只要sum3 + sum1 + sum2 >=0,车必然能开回q站。而sum3 + sum1 + sum2 其实就是 diff数组的总和 Total,遍历完所有元素已经算出来了。因此 Total 能否 >= 0,,就是是否存在这样的站点的充分必要条件。

第二个性质的证明请看这篇转载的文章: 这篇文章其实是完整证明,但我觉得其对第一个性质的证明貌似有点问题(也许是我没看懂呢),所以用上面的代替了。

有了这两个性质,代码就很简单了:

class Solution {public:int canCompleteCircuit(vector<int> &gas, vector<int> &cost){int temp = 0, sum = 0, index = 0;for (int i = 0; i < gas.size(); ++i){temp += gas[i]-cost[i];sum += gas[i]-cost[i];if (temp < 0){index = i+1;temp = 0;}}return sum>=0 ? index : -1;}};

写程序也还是要懂点数学的,想做一个好的程序员也不是这么简单的。

如果困难是堵砖墙,拍拍它说你还不够高。

hh1562535601的专栏

相关文章:

你感兴趣的文章:

标签云: