/方法1
// class Solution {
// public:
// int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
// //暴力解法,时间复杂度n^2 超时
// //思路:遍历每一个点,跑一圈,如果油量>=0,这个加油站可行
// for(int i=0;i<gas.size();i++){
// int res=gas[i]-cost[i];//剩余油量
// int index=(i+1)%cost.size();
// while(res>0&&index!=i){
// res+=gas[index]-cost[index];
// index=(index+1)%cost.size();
// }
// if(res>=0&&index==i){
// return i;
// }
// }
// return -1;
// }
// };
方法2
// class Solution {
// public:
// int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
// //从全局最优解出发
// //1.如果油的总和小于花费的总和一定是没有答案的
// //2.如果从0开始累加到最后,最小值是正数,说明可以从0到最后,那么这是一个可行的点
// //3.如果累加到最后最小值是负的,说明这个点不是从0点出发,从后往前找看看能不能填平
// int cursum=0;
// int min=INT_MAX;
// for(int i=0;i<gas.size();i++){
// int rest=gas[i]-cost[i];
// cursum+=rest;
// if(cursum<min){
// min=cursum;
// }
// }
// //第一种
// if(cursum<0)return -1;
// //第二种
// if(min>0)return 0;
// //第三种 填平
// for(int i=gas.size()-1;i>=0;i--){
// int rest=gas[i]-cost[i];
// min+=rest;
// if(min>=0)return i;
// }
// return -1;
// }
// };
方法3
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
//从局部最优解出发
int cursum=0;
int totalsum=0;
int start=0;//起始位置
for(int i=0;i<gas.size();i++){
cursum+=gas[i]-cost[i];
totalsum+=gas[i]-cost[i];
if(cursum<0){
start=i+1;
cursum=0;
}
}
if(totalsum<0)return -1;
return start;
}
};