這一題是貪心不是模擬 是貪心不是模擬 是貪心不是模擬!
如果用模擬的做法會比較慢,也失去了做這一題的趣味了。
模擬的方法很簡單,就是每一個加油站都做起點模擬一遍,試一下能不能完成一圈,能完成一圈就儲存答案,不能完成的就往下一個找
如果都不能完成則返回-1
貪心的做法非常的巧妙,整個迴圈陣列如下性質。
對於一個迴圈陣列,如果這個陣列整體和 >= 0,那麼必然可以在陣列中找到這麼一個元素:從這個陣列元素出發,繞陣列一圈,能保證累加和一直是出於非負狀態。
這個需要用集合的方法證明:
迴圈陣列分成兩個必存在一個區間二分,使得{區間1的和}>0 且{區間1的和}>=abs{區間2的和}。
我們只要從這個找到的區間1的起始位置出發,必然能累加和處於非負狀態。
註釋中有講解如何處理一些細節的問題。
class Solution { public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int n=gas.size(); int j=-1; int sum=0,total=0; for(int i=0;i<n;i++){ sum+=gas[i]-cost[i]; total+=gas[i]-cost[i]; if(sum<0){ /*說明之前的油不能支撐到這個加油站,之前的加油站都不能作為起點*/ sum=0; /*重置為0*/ j=i; /*將此加油站後一點設為起點再尋找*/ } } /*先判斷total是否小於0,小於0說明找不到這個起始點*/ if(total<0)return -1; else return j+1; } };