下图的 黑色折线图 即 总油量剩余值,若要满足题目的要求:跑完全程再回到起点,总油量剩余值 的任意部分都需要在 X 轴以上,且跑到终点时:总剩余汽油量 >= 0。
为了让 黑色折线图 任意部分都在 X 轴以上,我们需要向上移动 黑色折线图,直到所有点都在 X 轴或 X 轴以上。此时,处在 X 轴的点即为出发点。即 黑色折线图 的最低值的位置:index = 3。
eg:黑色:从0开始的汽油总剩余
输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2] 输出: 3 解释: 从 3 号加油站(索引为 3 处)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油 开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油 开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油 开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油 开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油 开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。 因此,3 可为起始索引。
class Solution {
public int canCompleteCircuit(int[] gas, int[] cost) {
int len = gas.length;
int spare = 0;
int minspare = Integer.MAX_VALUE;
int minIndex = 0;
for(int i = 0;i<len;i++){
spare +=gas[i] - cost[i];
if(spare < minspare){
minspare = spare;
minIndex = i;
}
}
return spare<0 ? -1: (minIndex + 1) % len;
}
}