134.加油站

71 阅读1分钟

题目:
在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] **升。

你有一辆油箱容量无限的的汽车,从第 **i **个加油站开往第 **i+1 **个加油站需要消耗汽油 cost[i] **升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
算法:
gas=[...i...j...],从i出发,最远能驾驶到j,意味着i<= k <= j, 从k开始都无法绕一圈,假设从k出发能绕一圈,而从i触发能到达k,则i也能绕一圈,和假设矛盾。所以直接从j + i开始出发,进行下一次查找。
当从i出发,最远到j,而j小于i时,即gas=[...j...i...],此时不可能绕一圈,直接返回。j< m < i,因为m的所有值,i已经遍历检查过了。

func canCompleteCircuit(gas []int, cost []int) int {
	length := len(gas)
	for i := 0; i < len(gas); i ++ {
		remainGas := 0
		j := i
		for ; j < i + length; j ++ {
			index := j % length
			if remainGas + gas[index] - cost[index] < 0 {
				break
			}
			remainGas = remainGas + gas[index] - cost[index]
		}
		// 能走一圈
		if i != j && j % length == i {
			return i
		}

		if j % length < i {
			return - 1
		}
		i = j % length
	}
	return -1
}