题目:
题解:
假设rest[i]=gas[i] - cost[i] 为每个加油站的剩余量,如果总的加油站剩余量大于0,那么一定可以跑完一圈。
贪心:i从0开始累加rest[i],和记为currentSum,一旦curSum小于零,说明[0, i]区间都不能作为起始位置,起始位置从i+1算起,再从0计算currentSum。
如果能跑完一圈,最终剩余的油量一定是大于0的,前面有多少负数,后面就有会有多少正数。
public int canCompleteCircuit(int[] gas, int[] cost) {
int currentSum = 0;
int totalSum = 0;
int index = 0;
for (int i = 0; i < gas.length; i++) {
currentSum += gas[i] - cost[i];
totalSum += gas[i] - cost[i];
if (currentSum < 0) {
index = i + 1;
currentSum = 0;
}
}
// 所以加油站余量小于0,一定跑不了一圈
return totalSum < 0 ? -1 : index;
}
时间复杂度:O(n)