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;
}
};
浙公网安备 33010602011771号