letcode加油站問題總結

洋神123發表於2020-11-18

思路一
官方給的數學公式推導後的程式碼:
思路是:
我們首先檢查第 00 個加油站,並試圖判斷能否環繞一週;如果不能,就從第一個無法到達的加油站開始繼續檢查。

只需要選擇性的記憶上一次不能夠到達的位置,就可以化提升暴力的效果。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int n = gas.size();
        int i = 0;
        while (i < n) {
            int sumOfGas = 0, sumOfCost = 0;
            int cnt = 0;
            while (cnt < n) {
                int j = (i + cnt) % n;
                sumOfGas += gas[j];
                sumOfCost += cost[j];
                if (sumOfCost > sumOfGas) {
                    break;
                }
                cnt++;
            }
            if (cnt == n) {
                return i;
            } else {
                i = i + cnt + 1;
            }
        }
        return -1;
    }
};

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/gas-station/solution/jia-you-zhan-by-leetcode-solution/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

思路二
引用Wowudi老哥的原話,

“直觀地想到,字首和最低點的後一個點是最佳起點,以它為起點的後半段一定是能走通的,再保證全程有盈餘,就可以走完全程。”

java實現

public int canCompleteCircuit(int[] gas, int[] cost) {
    int len = gas.length;
    int spare = 0;
    int minSpare = Integer.MAX_VALUE;
    int minIndex = 0;

    for (int i = 0; i < len; i++) {
        spare += gas[i] - cost[i];
        if (spare < minSpare) {
            minSpare = spare;
            minIndex = i;
        }
    }

    return spare < 0 ? -1 : (minIndex + 1) % len;
}

作者:cyaycz
連結:https://leetcode-cn.com/problems/gas-station/solution/shi-yong-tu-de-si-xiang-fen-xi-gai-wen-ti-by-cyayc/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。