非常經典的一道題。可以轉換成求最大連續和做,但是有更簡單的方法。基於一個數學定理:
如果一個數組的總和非負,那么一定可以找到一個起始位置,從他開始繞數組一圈,累加和一直都是非負的
(證明貌似不難,以后有時間再補)
有了這個定理,判斷到底是否存在這樣的解非常容易,只需要把全部的油耗情況計算出來看看是否大於等於0即可。
那么如何求開始位置在哪?
注意到這樣一個現象:
1. 假如從位置i開始,i+1,i+2...,一路開過來一路油箱都沒有空。說明什么?說明從i到i+1,i+2,...肯定是正積累。
2. 現在突然發現開往位置j時油箱空了。這說明什么?說明從位置i開始沒法走完全程(廢話)。那么,我們要從位置i+1開始重新嘗試嗎?不需要!為什么?因為前面已經知道,位置i肯定是正積累,那么,如果從位置i+1開始走更加沒法走完全程了,因為沒有位置i的正積累了。同理,也不用從i+2,i+3,...開始嘗試。所以我們可以放心地從位置j+1開始嘗試。
代碼:
1 int canCompleteCircuit(vector<int> &gas, vector<int> &cost) { 2 int start = 0; // 起始位置 3 int remain = 0; // 當前剩余燃料 4 int debt = 0; // 前面沒能走完的路上欠的債 5 6 for (int i = 0; i < gas.size(); i++) { 7 remain += gas[i] - cost[i]; 8 if (remain < 0) { 9 debt += remain; 10 start = i + 1; 11 remain = 0; 12 } 13 } 14 15 return remain + debt >= 0 ? start : -1; 16 }