题目
代码(7.27 首刷看解析)
一开始暴力,for套while,复杂度n2,超了。。。
我寻思官方的题解不也是n2吗?搞不懂。
思路:从头遍历一遍,如果 总油量-总消耗量 为负,说明无法绕圈(因为从任意点出发绕一圈的总油量-总消耗量都相等)。 否则从遍历一遍中,累计油量-累计消耗量的最低点出发——这样保证从这个出发点回到这个出发点的过程中,累计油量-累计消耗量>总油量-总消耗量恒成立。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
int bottom = 0, sum = 0, startid = -1;
for(int i = 0; i < n; i++) {
sum += gas[i] - cost[i];
if(sum < bottom) { // 说明前面都是在消耗
bottom = sum;
startid = i;
}
}
if(sum < 0) return -1;
return startid+1;
}
};
代码(9.12 二刷看解析)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int sum = 0, bottom = 0;
int index = -1;
for(int i = 0; i < gas.size(); i++) {
sum += gas[i]-cost[i];
if(sum < bottom) {
bottom = sum;
index = i;
}
}
if(sum < 0)
return -1;
return index+1;
}
};
代码(9.29 三刷自解)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int index = -1;
int ans = 0, cur = 0;
int sum = 0;
for(int i = 0; i < gas.size(); i++) {
cur = cur + gas[i]-cost[i];
if(cur < ans) {
ans = cur;
index = i;
}
}
return cur < 0 ? -1 : index+1;
}
};