[Leetcode]134.加油站

AdamWong發表於2019-01-03

這一題是貪心不是模擬 是貪心不是模擬 是貪心不是模擬!

如果用模擬的做法會比較慢,也失去了做這一題的趣味了。

模擬的方法很簡單,就是每一個加油站都做起點模擬一遍,試一下能不能完成一圈,能完成一圈就儲存答案,不能完成的就往下一個找

如果都不能完成則返回-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;
    }
};

 

相關文章