题目:
在一条环路上有 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
}