O(N^2)的做法是很容易想到的。枚举起点,遍历一圈,在这个过程中剩余的油量必须大于0
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = cost.size();
for(int i=0,j;i<n;i++){
int left = 0;
for(j=0;j<n;j++){
int k = (i+j)%n;
left+= gas[k]-cost[k];
if(left<0) break;
}
if(j==n) return i;
}
return -1;
}
};
优化的方法是假如从i点走到k点发现油量小于0了,那么i到k的任意一点都不能作为车站起点, 根据这个方法,每次都可以删掉i到k之间的车站。
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = cost.size();
for(int i=0,j;i<n;){
int left = 0;
for(j=0;j<n;j++){
int k = (i+j)%n;
left+= gas[k]-cost[k];
if(left<0) break;
}
if(j==n) return i;
i = i+j+1;
}
return -1;
}
};