在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。
你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。
Python
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
length = len(gas)
for i in range(length):
j = (i + 1 + length) % length
g = gas[i] - cost[i]
if g < 0:
continue
while j != i:
g += gas[j] - cost[j]
j = (j + 1 + length) % length
if g < 0:
break
if g < 0:
continue
return i
return -1
Go
func canCompleteCircuit(gas []int, cost []int) int {
length := len(gas)
for i := 0; i < length; i++ {
g := gas[i] - cost[i]
if g < 0 {
continue
}
for j := (i + 1 + length) % length; (j+length)%length != i; j++ {
g += gas[(j+length)%length] - cost[(j+length)%length]
if g < 0 {
break
}
}
if g >= 0 {
return i
}
}
return -1
}
写完发现上面一些取余是多余的orz
i
能从i
触发绕一圈回到i
,且i
有且仅有一个xm
到xn
后无法再继续行驶,那么xm
一定不是满足条件的加油站,且xm
到xn
之间包括xn
均不为满足条件的加油站,因为只要能从符合条件的加油站出发一定能走完全程Python
class Solution:
def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
length = len(gas)
i = 0
while(i < length):
j = i + 1
g = gas[i] - cost[i]
if g < 0:
i += 1
continue
while j % length != i:
g += gas[j % length] - cost[j % length]
j += 1
if g < 0:
i = j
break
if g < 0:
if j >= length:
return -1
else:
continue
return i
return -1
Go
func canCompleteCircuit(gas []int, cost []int) int {
length := len(gas)
for i := 0; i < length; i++ {
g := gas[i] - cost[i]
if g < 0 {
continue
}
for j := i + 1; j%length != i; j++ {
g += gas[j%length] - cost[j%length]
if g < 0 {
i = j
break
}
}
if g < 0{
if i > length{
return -1
}else{
continue
}
}
return i
}
return -1
}
感觉官方题解和这个题解<-细节处理的很好