思路:这题题目描述挺复杂的,简化一下其实就是这个意思,我们需要走过每一个加油站,每个加油站可以加固定数量的油,开到下一个加油站也需要消耗固定数量的油,判断从哪一个加油站出发可以成功走完所有加油站,这里的加油和耗油的数组可以看成是循环队列 因为从末尾出发也能直接到开头。
那么我们首先可以判断是否具有能成功走完的必要条件 即总加油的量要大于总耗油的量,如果不满足这个条件 从哪个地方出发都是无效的
判断完之后,此时题目提供的条件是足够成功走完所有加油站的,我们需要判断从哪个地方出发是合适的。我们知道每个加油站的加油和耗油是有差值的,我们从第一个开始遍历,并用一个累加器记录这些差值的累加,如果出现负数,那么就从这个加油站的下一个站出发并且重置累加器的值。(总加油一定大于总耗油,如果一个区间之内出现耗油大于加油,那么就不能从这个区间出发,而是从下一个区间出发,因为下一个区间内加油一定会大于耗油,累加器就是用来判断这个区间的)
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
// 先计算耗油和加油的总和 如果总耗油大于总加油则一定不行
int gasTotal = Arrays.stream(gas).sum();
int costTotal = Arrays.stream(cost).sum();
int start = 0;
int sum = 0;
if (costTotal > gasTotal) return -1;
// 此时总加油一定大于等于总耗油 一定能跑完 则需要选择合适的起始位置
for (int i = 0 ; i < gas.length;i++){
// 从0开始计算累加的差值
sum += gas[i]-cost[i];
// 如果差值小于0 则说明这段区间不能作为起点 需要从下一个点开始重新计算
// 因为gastotal一定大于costtotal 这段区间累加差小于0 后面区间一定大于0
if (sum < 0){
start = i+1;
// sum重置为0
sum = 0;
}
}
return start;
}
}