134.加油站
我的解法:
解答错误,超出时间限制
- remain记录开始时剩余油量,初值为0;
- for循环遍历每个元素,尝试找出可行的起点start;
- 剩余油量remain加上加油站油量gas[i]需要>=消耗汽油量cost[i]才能跑到下一个加油站。
这一解法的时间复杂度为O(n^2),超出了测试用例的时间限制
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int remain,start;
for(int i = 0; i < n; ++i){
remain = 0;
if(remain +gas[i] >= cost[i]){
start = i;
while(remain + gas[i] >= cost[i]){
remain += gas[i] - cost[i];
i = (i + 1) % n;
if(i == start){
return start;
}
}
i = start;
}
}
return -1;
}
};
参考解法:
利用空间换时间的理念:
- 首先创建一个长度为n的数组remain,元素remain[i]存储gas[i] - cost[i]的值;
- 使用totalSum来记录总的gas值减去总的cost值的结果,为负数就代表总油量不足以支撑环行一周所需的油量,返回-1;
- 从下标0开始遍历数组remain,判断各个i作为start的可行性。这里使用sum累加元素remain[i],sum一旦为负,就代表当前出发下标start不能支撑环路行驶一周,则将sum清空为0,更新出发下标start;
- 由于totalSum不为负值代表存在可行解,因此这里的for循环一定可以找出满足条件的start(start满足:remain[start] + remain[start + 1] + ... + remain[n - 1] >= 0)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
vector<int> remain(n);
int totalSum = 0;
for(int i = 0; i < n; ++i){
remain[i] = gas[i] - cost[i];
totalSum += remain[i];
}
if(totalSum < 0){
return -1;
}
int start = 0,sum = 0;
for(int i = 0; i < n; ++i){
sum += remain[i];
if(sum < 0){
sum = 0;
start = i + 1;
}
}
return start;
}
};