给定两个数组,分别表示加油站的油量,以及从当前加油站到达下一个加油站需要消耗的油量。油箱无限大,求是否可以从某个加油站出发,最后返回原地。
基本思路就是我们可以从每个加油站开始计算看看是否可以回到当前位置,整体算法是N^2, 提交后是超时,所以另一个角度考虑。
因为最终是要回到原点,所以我们先假设从0开始,然后通过tank
来记录油箱里的剩余油量。
如果tank已经小于0了。我们就可以知道从0到当前位置的加油站油量是不够的。只能从下一个加油站开始计算。
如上图所示,在绿色部分表示,从0号加油站开始到某站x后,邮箱空了,所以我们需要从下一个加油站开始算开始位置,这是因为绿色是只有到达x加油站后油箱才空,所以到达绿色之间的任何加油站,邮箱都不为空
,如果选择期间的某个加油站y作为期间,那么他到x邮箱必然会空,相当于一个负数减去一个整数,更小了。
黄色部分同绿色部分一样,从x的下一个加油站到z加油站导致邮箱空了。
紫色部分代表最后邮箱没有空,所以就是从z的下一个加油站开始,一直到最后一个加油站,邮箱是有剩余的,如果要确保从z开始可以再回到z,我们就需要确保紫色部分的油量+绿色+黄色的油量是大于0的。
func Solution(gas []int, cost []int) int {
l := len(gas)
tank, total, target := 0, 0, 0
for i := 0; i < l; i++ {
tank += gas[i] - cost[i]
if tank < 0 {
target = i + 1
total += tank
tank = 0
}
}
if tank+total < 0 {
return -1
}
return target
}