134. Gas Station

在这里插入图片描述

这题的基本方法和优化方法都是自己想出来的:)
面试的时候这就是理想的答题步骤,先快速的说出最基本的暴力解法,然后进一步主动说出优化的方法。
一:暴力方法。
很简单,一个一个位置实验:

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int gasSum = accumulate(gas.begin(), gas.end(), 0);
        int costSum = accumulate(cost.begin(), cost.end(), 0);
        if (costSum > gasSum)
            return -1;
        for (int i = 0; i < gas.size(); ++i) {
            if (cost[i] > gas[i])
                continue;
            if (isValidStart(gas, cost, i))
                return i;
        }
        return -1;
    }
private:
    bool isValidStart(vector<int>& gas, vector<int>& cost, int idx) {
        int remainGas = gas[idx];
        int i = idx;
        while (true) {
            remainGas -= cost[i];
            if (remainGas < 0)
                return false;
            ++i;
            if (i == gas.size())
                i = 0;
            if (i == idx)
                break;
            remainGas += gas[i];
        }
        return true;
    }
};

二:优化方法
假设用gas数组减去cost数组,得到一组新的,我们找到第一个这样的位置:从它开始一直往后,不会有加起来为负的情况。并且需要确定gas数组总和加起来大于等于cost数组总和,这样可以确保绕回到开头再继续往后走的时候,一样不会有负数。我们可以在迭代的同时计算两个数组的和,这样就省得多遍历一次。

class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int gasSum = 0, costSum = 0;
        int retIdx = -1;
        int posGap = 0;
        for (int i = 0; i < gas.size(); ++i) {
            gasSum += gas[i];
            costSum += cost[i];
            posGap += (gas[i] - cost[i]);
            if (posGap < 0) {
                posGap = 0;
                retIdx = -1;
            } else {
                if (retIdx == -1)
                    retIdx = i;
            }
        }
        if (gasSum >= costSum)
            return retIdx;
        else
            return -1;
    }
};
posted @ 2019-09-30 20:44  于老师的父亲王老爷子  阅读(33)  评论(0)    收藏  举报