134. 加油站 - 力扣(LeetCode)
先寻找起点,然后遍历:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size();
for(int i = 0; i < n; ++i){//寻找起始点
if(gas[i] < cost[i]) continue;
int val = 0, j = i;
for(; j < i+n; ++j){
int idx = j % n;//首尾相连
val += gas[idx] - cost[idx];
if(val < 0) break;
}
if(val >= 0) return i;
}
return -1;
}
};
其实还有一个贪心算法的优化:加油站 - 加油站 - 力扣(LeetCode)
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size(), run = 0, rest = 0, start = 0;
for(int i = 0; i < n; ++i){//寻找起始点
run += gas[i] - cost[i];
rest += gas[i] - cost[i];
if(run < 0){
start = i + 1;
run = 0;
}
}
return rest < 0 ? -1 : start;
}
};