题目链接:https://leetcode-cn.com/problems/gas-station/
题目描述:
题解:
1.如果gas的总和小于cost总和,一定不能跑一整圈。
2.每个加油站剩余量rest[i] = gas[i] - cost[i]
3.i从0开始累加rest[i],和记为curSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算curSum。
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;
}
};
方法二:
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curSum = 0;
int min = 0;
for(int i = 0; i < gas.size(); i++)
{
int res = gas[i] - cost[i];
curSum += res;
if(curSum < min)
min = curSum;
}
if(curSum < 0) return -1; //gas的总和小于cost总和
if(min >= 0) return 0; //从0累加到最后一站,没有出现负数,说明从0出发,可以环绕一圈
for(int i = gas.size() - 1; i >= 0; i--) //累加的最小值是负数,则需要从非0节点出发,从后向前遍历,能把负数抵消的节点就是出发节点
{
int rest = gas[i] - cost[i];
min += rest;
if(min >= 0)
return i;
}
return -1;
}
};